"치명적인 오류 : 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}
'IT story' 카테고리의 다른 글
코드에서 attrs.xml에 생성 된 enum을 얻는 방법 (0) | 2020.09.01 |
---|---|
Windows에 inotify와 같은 것이 있습니까? (0) | 2020.09.01 |
바이트 배열이란 무엇을 의미합니까? (0) | 2020.09.01 |
ProgressDialog에서 '미확정'은 무엇을 의미합니까? (0) | 2020.08.31 |
CommandError : DEBUG가 False 인 경우 settings.ALLOWED_HOSTS를 설정해야합니다. (0) | 2020.08.31 |