2017-05-13 10 views
1

私はビューコントローラにテーブルビューを埋め込み、埋め込みテーブルコントローラから親ビューコントローラの保存ボタンにアクセスしようとしています。以下のプロトコルを使用している場合:スウィフトサブクラスとプロトコル

私tableviewcontrollerサブクラス(SettingsController)はsaveButtonメソッドを持っており、私は次のコードを使用している場合、それは動作します。しかし

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 

    super.prepare(for: segue, sender: sender) 

    guard let optionsTable = segue.destination as? SettingsController else { 
     fatalError("Unexpected destination: \(segue.destination)") 
    } 

    optionsTable.saveButton = self.saveButton 

} 

を、私が使用して、次の実装を使用しようとしていますプロトコル:

protocol SettingsOptionsTable { 

    var saveButton: UIBarButtonItem? {get set} 

} 

SettingsControllerは、SettingsOptionsTableプロトコルを実装しています。しかし、以下のコード:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 

    super.prepare(for: segue, sender: sender) 

    guard let optionsTable = segue.destination as? SettingsOptionsTable else { 
     fatalError("Unexpected destination: \(segue.destination)") 
    } 

    optionsTable.saveButton = self.saveButton 

} 

は私にコンパイルエラー与える:私はなぜ理解していない

:「プロパティに割り当てることができません 『optionsTable』 『を聞かせて』一定です」。 optionsTableオブジェクトは定数であり、プロトコルを実装しており、プロパティを割り当てます。 "guard let"を "guard var"に変更するとコードが機能します。 誰でもこれを私に説明できますか?

おかげ

答えて

2

プロトコルは参照してクラスに関連しているよう意味はそれ以外の場合、プロトコルはセマンティクスを持つオブジェクトとして扱われ、それがエラーを起こしているclass属性

protocol SettingsOptionsTable : class { 

を加えます。ドキュメントから

Use a class-only protocol when the behavior defined by that protocol’s requirements assumes or requires that a conforming type has reference semantics rather than value semantics.

関連する問題