2014-12-09 8 views
0

나는 Printable 개체의 배열을 가지고 있지만 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

'class func'에서'self'를 사용하려는 목적은 무엇입니까? –

+0

방금 ​​질문을 수정했습니다. 감사합니다. – Caipivara

답변

5

스위프트 배열은 모든 종류의 개체 (예 : 모든 문자열 또는 모두 Int)를 포함해야합니다. Objective-C NSArray는 다양한 종류의 객체 (예 : 일부 NSString 및 일부 NSNumber)를 포함 할 수 있습니다. 그러므로 Objective-C에서 그런 종류의 배열을 얻는다면, 그것을 Swift 배열 참조로 마술처럼 할당 할 수는 없습니다.

내가 그 상황에서하는 일은 스위프트에게 받아 들일 수 있도록 배열을 만드는 것이다. Objective-C에서 얻은 세부 사항이 무엇인지는 알 수 없습니다. 실제 전략은 세부 정보와 어레이로 수행하려는 작업에 따라 달라집니다. 한 가지 방법은 AnyObject의 Swift 배열에 할당하거나 캐스트하는 것입니다. 또는 NSArray로 남겨두고 NSArray 메서드를 사용하여 NSArray로 작업 할 수도 있습니다.

다음은 내 코드의 예입니다. arr은 NSString과 NSNull 객체가 혼합 된 NSArray입니다. arr2는 지금

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

: I 따라서 나에게 스위프트가 해결할 수있는 단지 문자열 배열을주고, 그래서 모든 NSNull 개체에 대해 빈 문자열을 대체의는 NSString 객체의 어느 것도 빈 문자열 없습니다 알고 순수 Swift [String] 어레이.