Массив объектов EXC_BAD_INSTRUCTION назначает Swift

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

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:

фатальная ошибка: массив не может быть соединен мостом с Objective-C

Это одна попытка решить эту проблему:

Почему?


person Daniel Gomez Rico    schedule 09.12.2014    source источник
comment
С какой целью вы используете self в class func ?   -  person A-Live    schedule 09.12.2014
comment
Я только что отредактировал вопрос, спасибо   -  person Daniel Gomez Rico    schedule 09.12.2014


Ответы (1)


Swift Array должен содержать все объекты одного типа (например, все String или все Int). Объект NSArray Objective-C может содержать множество различных типов объектов (например, некоторые NSString и некоторые 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].

person matt    schedule 09.12.2014