2017-05-13 169 views
1

我在視圖控制器中嵌入一個表視圖,並試圖從嵌入表控制器訪問父視圖控制器保存按鈕。如果有以下協議:Swift子類與協議

它的工作原理,如果我的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.