在 Swift 中读取 CGPoints 的 NSArray
Read NSArray of CGPoints in Swift
我在 Objective-C class 中有一个函数 return 是一个 NSArray:
- (NSArray *) myAwesomeFunction {
// Good stuff here
return array
}
现在我知道这个数组的成员都是NSValue
个对象,里面有一个CGPoint
。但是,Swift 无法获得此信息,它将 return 类型(正确地)推断为 [AnyObject]!
现在,当我尝试将数组成员转换为 NSValue
时,我收到了一个转换错误。
let myArray = AnObjectiveCClass.myAwesomeFunction()
let myValue = myArray[0] as NSValue // Cast error since AnyObject cannot be cast to NSValue
这给我留下了一个问题,我如何访问我的 Swift class 中数组的内容?最后我想检索数组内的 CGPoint 值。
在我看来,您可以将整个数组转换为 [NSValue]
数组:
if let downcastNSValueArray = myArray as? [NSValue] {
let myValue = downcastNSValueArray[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 return nil
。 myValue
将被视为非可选。所以上面的代码不需要任何额外的类型处理来满足编译器的要求,但如果 myArray == nil
或 myArray.count < 1
.
仍可能触发运行时异常
我在 Objective-C class 中有一个函数 return 是一个 NSArray:
- (NSArray *) myAwesomeFunction {
// Good stuff here
return array
}
现在我知道这个数组的成员都是NSValue
个对象,里面有一个CGPoint
。但是,Swift 无法获得此信息,它将 return 类型(正确地)推断为 [AnyObject]!
现在,当我尝试将数组成员转换为 NSValue
时,我收到了一个转换错误。
let myArray = AnObjectiveCClass.myAwesomeFunction()
let myValue = myArray[0] as NSValue // Cast error since AnyObject cannot be cast to NSValue
这给我留下了一个问题,我如何访问我的 Swift class 中数组的内容?最后我想检索数组内的 CGPoint 值。
在我看来,您可以将整个数组转换为 [NSValue]
数组:
if let downcastNSValueArray = myArray as? [NSValue] {
let myValue = downcastNSValueArray[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 return nil
。 myValue
将被视为非可选。所以上面的代码不需要任何额外的类型处理来满足编译器的要求,但如果 myArray == nil
或 myArray.count < 1
.