我在Objective-C类中有一个返回NSArray的函数:
- (NSArray *) myAwesomeFunction {
// Good stuff here
return array
}
现在我知道这个数组的成员都是NSValue
个对象,里面有CGPoint
。但是,此信息不适用于Swift,它将返回类型(正确)推断为[AnyObject]!
现在,当我尝试将数组成员强制转换为NSValue
时,我得到了一个错误。
let myArray = AnObjectiveCClass.myAwesomeFunction()
let myValue = myArray[0] as NSValue // Cast error since AnyObject cannot be cast to NSValue
这给我留下了一个问题,我如何在Swift类中访问数组的内容?最后,我想检索数组内的CGPoint值。
答案 0 :(得分:1)
在我看来,您可以将整个数组转换为[NSValue]
数组:
if let downcastNSValueArray = myArray as? [NSValue] {
let myValue = downcastNSValueArray[0]
}
答案 1 :(得分:0)
您只需在方法中添加Objective-C generics annotation:
+ (NSArray<NSValue *> *) myAwesomeMethod {
// Good stuff here
return array;
}
现在Swift会自动推断出类型:
let myArray = MyClass.myAwesomeMethod()
let myValue = myArray[0]
let myPoint = myValue.pointValue
请注意,myArray
将是一个隐式解包的可选项,即[NSValue]!
,因此如果您知道myAwesomeMethod
将不会返回{{}},您也可以添加nullability annotations 1}}。 nil
将被视为非可选项。因此,上面的代码不需要任何其他类型处理来满足编译器,但如果myValue
或myArray == nil
可能仍会触发运行时异常。