92

Swift プロトコルを宣言しました。

protocol Option {
    var name: String { get }
}

このプロトコルの複数の実装 (いくつかのクラス、いくつかの列挙型) を宣言します。

次のように宣言されたプロパティを持つView Controllerがあります。

var options: [Option] = []

このプロパティをOption別の VC のプロトコルを実装するオブジェクトの配列に設定しようとするとprepareForSegue、実行時エラーが発生します。

fatal error: array cannot be bridged from Objective-C

なぜこれが機能しないのですか?コンパイラは必要なすべての情報を持っていますが、Objective-C がそれと何をしなければならないかはまったくわかりません。私のプロジェクトには Swift ファイルしか含まれておらず、これらの配列はフレームワーク メソッドに出入りしていません。にブリッジする必要がありますNSArray

4

4 に答える 4

83

私は解決策を見つけました。それはかなり...満足のいくものではありませんが、機能します。目的のView Controllerに配列を設定する場所:

destinationViewController.options = options.map({$0 as Option})
于 2015-05-07T12:22:59.297 に答える
22

コンパイラは、オプションを実装するものの配列を渡していることを認識しています

あなたは、問題の原因を示唆する非常に明白な発言をそこに入れました。「オプションを実装するものの配列」は、オプションの配列ではありません。

問題は、optionsバックを作成した時点 ( prepareForSegue) でのバックのタイプにあります。そのコードは表示されませんが、その時点でキャスト/タイプに失敗していると思います。そのため、割り当ては失敗します。options実際にオプションを採用するために起こることの配列かもしれませんが、それだけでは十分ではありません。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正常に動作します。)

于 2015-05-07T12:44:41.930 に答える
1

これも問題なく動作します

destinationViewController.options = options.map{$0}
于 2016-05-17T15:04:19.627 に答える