在 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 nilmyValue 将被视为非可选。所以上面的代码不需要任何额外的类型处理来满足编译器的要求,但如果 myArray == nilmyArray.count < 1.

仍可能触发运行时异常