programing

"치명적 오류: Objective-C에서 어레이를 브리지할 수 없습니다."-왜 노력하는 거야, 스위프트?

closeapi 2023. 8. 29. 20:39
반응형

"치명적 오류: Objective-C에서 어레이를 브리지할 수 없습니다."-왜 노력하는 거야, 스위프트?

스위프트 프로토콜을 선언했습니다

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})

컴파일러는 내가 옵션을 구현하는 것들의 배열을 전달하고 있다는 것을 알고 있습니다.

당신은 거기서 아주 노골적인 말을 흘렸고, 그것은 문제의 근원을 암시합니다.옵션을 구현하는 항목 배열은 옵션 배열이 아닙니다.

문제는 다음 유형에 있습니다.options생성한 지점으로 되돌아갑니다(에서).prepareForSegue) 당신은 그 코드를 보여주지 않지만, 저는 당신이 그 시점에서 그것을 캐스트/타이핑하는 데 실패할 것이라고 확신합니다.그래서 과제가 실패하는 겁니다.options실제로 옵션을 채택하는 것은 일련의 작업일 수 있지만, 그것만으로는 충분하지 않습니다. 옵션 배열로 입력해야 합니다.

자, 다시.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}

언급URL : https://stackoverflow.com/questions/30100787/fatal-error-array-cannot-be-bridged-from-objective-c-why-are-you-even-trying

반응형