Swift 프로토콜을 선언했습니다.
protocol Option {
var name: String { get }
}
이 프로토콜의 여러 구현 (일부 클래스, 일부 열거 형)을 선언합니다.
다음과 같이 선언 된 속성이있는 뷰 컨트롤러가 있습니다.
var options: [Option] = []
이 속성을 Option
다른 VC에서 프로토콜 을 구현하는 개체 배열로 설정하려고 prepareForSegue
하면 런타임 오류가 발생합니다.
fatal error: array cannot be bridged from Objective-C
왜 작동하지 않습니까? 컴파일러는 필요한 모든 정보를 가지고 있으며 Objective-C가 그것과 어떤 관련이 있는지 전혀 이해하지 못합니다. 내 프로젝트에는 Swift 파일 만 포함되어 있으며 이러한 배열은 어떤 프레임 워크 메소드에서도 들어 오거나 나오지 않습니다. 에 브리지되어야 NSArray
합니다.
답변
해결책을 찾았습니다. 상당히 … 불만족 스럽지만 작동합니다. 대상 뷰 컨트롤러에서 배열을 설정하는 곳 :
destinationViewController.options = options.map({$0 as Option})
답변
컴파일러는 내가 Option을 구현하는 배열을 전달하고 있음을 알고 있습니다.
당신은 문제의 원인을 암시하는 매우 드러나는 발언을 놔 두었습니다. “옵션을 구현하는 사물의 배열”은 옵션의 배열이 아닙니다.
문제는 options
백을 생성 한 시점 (에서 prepareForSegue
) 의 백 유형에 있습니다 . 당신은 그 코드를 보여주지 않았지만, 나는 당신이 그 시점에서 그것을 캐스팅 / 타이핑하지 못했을 것이라고 확신합니다. 이것이 할당이 실패하는 이유입니다.options
실제로 Option을 채택하기 위해 발생하는 일들의 배열 일 수 있지만 그것만으로는 충분하지 않습니다. Option의 배열 로 입력 해야합니다 .
따라서 다시에서 prepareForSegue
다음 options
과 같이 형성하십시오 .
let options : [Option] = // ... whatever ...
지금 직접 할당 할 수 있습니다 destinationViewController.options
.
다음은 빠른 테스트 사례입니다 (놀이터에서, 나는 놀이터를 싫어하지만 용도가있을 수 있습니다).
protocol Option {
var name : String {get}
}
class ViewController : UIViewController {
var options : [Option] = []
}
enum Thing : Option {
var name : String {
get {
return "hi"
}
}
case Thing
}
let vc = ViewController()
let options : [Option] = [Thing.Thing]
vc.options = options // no problem
(실제로 실제 앱에서 이것을 테스트 prepareForSegue
했으며 제대로 작동합니다.)
답변
나는 같은 문제가 있었고 내 프로토콜을으로 표시하여 수정했습니다 @objc
. 귀하의 경우에는 다음과 같이 보일 것입니다.
@objc protocol Option {
var name: String { get }
}
이 답변 에서 해결책을 얻었습니다.
답변
이것도 잘 작동합니다
destinationViewController.options = options.map{$0}