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 масивът трябва да съдържа всички видове обекти (напр. всички String или всички Int). Objective-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 е чист масив [String] на Swift.

person matt    schedule 09.12.2014