2015-03-06 3 views
0

У меня есть функция в классе Objective-C, который возвращает NSArray:Чтение NSArray из CGPoints в Swift

- (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 внутри массива.

ответ

1

На мой взгляд, вы можете бросить весь массив в [NSValue] массив:

if let downcastNSValueArray = myArray as? [NSValue] { 
    let myValue = downcastNSValueArray[0] 
} 
+0

А это было очевидно ... Спасибо, хорошо работает с этим – Robin

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]!, поэтому вы также можете добавить nullability annotations, если знаете, что myAwesomeMethod никогда не вернется nil. myValue будет считаться необязательным. Таким образом, код выше не требует дополнительной обработки типов для удовлетворения компилятора, но может по-прежнему запускать исключения во время выполнения, если myArray == nil или myArray.count < 1.

Смежные вопросы