31 July 2016

프로젝트에서 Objective-C와 Swift를 혼용해서 쓰다 보면, Objective-C 코드의 결과 값을 Swift에서 받아 처리할 때, 모호한 경우가 있습니다.

예를 들어, Objective-C에서 NSMutableArray<Channel *> 값을 반환한다고 할 때 Nullability도 명시하지 않았다면, Swift는 NSMutableArray!로 판단합니다. 그리고 Swift에서 받은 값을 [Channel]로 Casting 하려고 한다면 Cast from NSMutableArray to unrelated type [Channel] always fails라고 컴파일러 경고가 발생합니다.

이는 Objective-C와 Swift의 명확성 차이로 인해 발생하는 문제이기도 합니다. 그러면 위의 컴파일 경고를 제거해보도록 합시다.

첫 번째로, 값이 있는지 없는지 명확해야 합니다. Objective-C에서 Nullability를 명시하지 않으면, Swift는 forced unwrapping 타입으로 받아야 합니다. 따라서 _Nullable 또는 _Nonnull을 사용하여 값이 있는지, 없는지를 명확하게 하고, 그렇지 않다면 guard 또는 if let을 사용하여 값이 있는지 없는지 확인해야 합니다.

두 번째로, Objective-C에서 NSArray, NSDictionary를 Swift 형태(ex.[Int:String], [Channel])로 명확하게 전달할 수 없습니다. 따라서 AnyObject로 Casting 한 후, 원하는 타입으로 Casting 합니다.

	// compiler warning
	guard let channels = DataManager().getData() as? [Channel] else { return }

	// fixed warning
	guard let channels = DataManager().getData() as AnyObject as? [Channel] else { return }

위와 같이 사용하면 Objective-C와 Swift를 같이 사용함에 있어서 문제 없이 원하는 동작을 수행할 수 있습니다.

참고 자료