[ios] “치명적인 오류 : Objective-C에서 어레이를 연결할 수 없습니다.”— 당신은 왜 시도하고 있습니까, Swift?

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}


답변