2014-12-09 5 views
0

У меня есть массив объектов для печати, но мне они нужны Equatable и AnyObject.EXC_BAD_INSTRUCTION массив объектов asign Swift

private(set) var items: [Printable] = [] 

class func withItems<T: AnyObject where T: Equatable, T: Printable>(items: [T], selectedItem: T? = nil) { 
    ... instance init ... 
    instance.items = items 
} 

И результат на EXC_BAD_INSTRUCTION:

fatal error: array cannot be bridged from Objective-C

Это одна попытка этой проблемы:

почему?

+0

Какова ваша цель использования 'self' в' class func'? –

+0

Я только что редактировал вопрос, спасибо – Caipivara

ответ

5

Swift Array должен содержать только один вид объекта (например, всю строку или весь Int). Объект-C NSArray может содержать множество различных типов объектов (например, некоторые NSStrings и некоторые NSNumbers). Следовательно, если вы получаете такой массив из Objective-C, вы не можете магически назначить его в ссылку массива Swift.

Что я делаю в этой ситуации - это массив массивов, чтобы сделать его приемлемым для Swift. Я не знаю, каковы детали того, что вы возвращаете из Objective-C; ваша фактическая стратегия будет зависеть от этих деталей и того, что вы хотите сделать с массивом. Один из подходов - назначить/вставить в массив Swift AnyObject. Или вы можете решить оставить его как NSArray и работать с ним полностью с помощью методов NSArray.

Вот пример из моего собственного кода. arr - это NSArray, представляющий собой смешанный пакет объектов NSString и NSNull. Я знаю, что ни один из объектов NSString не пустая строка, поэтому я заменить пустую строку для всех объектов NSNull, таким образом, давая мне массив только строки, которые Swift может иметь дело с:

let arr2 = (arr as Array).map { $0 as? String ?? "" } 

Теперь arr2 является чистый Swift [String] массив.

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