2016-03-07 66 views
0

我正在編寫一個試圖使用自定義協議定義函數的工廠類。編譯器會拋出一個錯誤,因爲我不知道如何將協議定義添加到函數參數中。如何在函數參數中指定一個協議?

實施例:

protocol MyCustomFunctions { 
    func customFunction() 
} 

class MyVC: UIViewController, MyCustomFunctions { 
    func customFunction() {} 
} 

class Factory { 

    func createButton(specificVC: UIViewController) // need protocol here 
    { 
     specificVC.customFunction() // error thrown 
    } 
} 

如何能一個特定的變量定義中的協議?

或者有另一種方法嗎?

回答

1

首先,公約規定班級以大寫字母開頭。

class MyVC: UIViewController, MyCustomFunctions { 
    func customFunction() {} 
} 

那麼你需要的是在論證

class factory: NSObject { 

    func createButton(specificVC: MyVC) // you need a class that conforms to protocol here. 
    { 
     specificVC.customFunction() // no error anymore 
    } 
}  

你有另一種選擇正確的類型。你可以簡單地承諾你不會透露對象的完整類型,你只會說它是一個符合協議的不透明對象。

class factory: NSObject { 

    func createButton(specificVC: MyCustomFunctions) // you need a class that conforms to protocol here. 
    { 
     specificVC.customFunction() // no error anymore 
    } 
}  

獎金:

的方式,你可以有思索這一點,並找到一個答案是,當我打電話specificVC.customFunction()這個>

則拋出Error ......嗯......所以這對象只能運行此函數,如果它的類型實際上具有該函數。所以讓我們來看一下參數類型 - UIViewController - .. UIViewController當然沒有這個函數。這是MyVC或協議。

Swift中的類型安全性非常嚴格。只要「遵循類型流程」,你就會很好。

+0

默認情況下,如果您沒有特定的原因,則不需要在swift中繼承NSObject。 Factory類不應該繼承任何東西。 –

+0

對不起,我是廢話在僞代碼。我實際上遵循你的兩個建議。我的工廠實際上比這個例子更復雜。我有多種VC類型。我認爲你的回答使我走向了正確的方向。謝謝。 –

+0

我加了一小筆獎金。 –

相關問題