在Swift中阅读NSArray的CGPoints

时间:2015-03-06 10:25:59

标签: ios objective-c swift nsarray

我在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值。

2 个答案:

答案 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将被视为非可选项。因此,上面的代码不需要任何其他类型处理来满足编译器,但如果myValuemyArray == nil可能仍会触发运行时异常。