我做一個協議:斯威夫特擴展存儲的協議
protocol SomeProtocol {
func getData() -> String
}
我做符合它的結構:
struct SomeStruct: SomeProtocol {
func getData() -> String {
return "Hello"
}
}
現在我希望每個UIViewController
有一個叫source
屬性,所以我可以做類似...
class MyViewController : UIViewController {
override func viewDidLoad() {
self.title = source.getData()
}
}
爲了達到這個目的,我創建了一個協議到d efine屬性:
protocol SomeProtocolInjectable {
var source: SomeProtocol! { get set }
}
現在我只需要到視圖控制器與此屬性擴展:
extension UIViewController: SomeProtocolInjectable {
// ???
}
我如何可以破解一起存儲的屬性,將與協議類型的工作?
什麼沒有奏效:
var source: SomeProtocol!
顯然是行不通的,因爲分機沒有存儲性能- 我不能use Objective-C associated objects因爲協議是不是一個對象
- 我不能wrap it in a class(這也爲其他值類型的工作,而不是協議)
任何其他建議?
會使用靜態屬性爲你工作嗎? –
這是一個很好的解決方法,但理想情況下不同的視圖控制器會有不同的「源」。如果你想把它作爲答案,如果沒有更好的事情發生,我會在一兩天內接受它。 –
請參閱下面的答案 - 您可以使用某些* proxy *類型爲每個實例實現不同的'source' ... –