[英]Type 'inout UIButton' does not conform to protocol 'ReactiveCompatible'
[英]Are inout variables of protocol type prohibited?
以下代碼:
protocol SomeProtocol {}
class SomeClass: SomeProtocol {}
private func doSomethingWith(inout someVar: SomeProtocol) {}
private var someGlobalVar = SomeClass() // inferring SomeClass's type
doSomethingWith(&someGlobalVar)
產生以下錯誤:
無法使用類型'(inout SomeClass)的參數列表調用'doSomethingWith'
將倒數第二行更改為private var someGlobalVar: SomeProtocol = SomeClass()
可解決錯誤。
SUBJ。
除了@Sulthan所說的,還有兩種可能的解決方案,具體取決於您的功能需要做什么。
您可以使函數通用 :
func doSomethingWith<T : SomeProtocol>(inout someVar: T) {}
現在您可以傳遞符合協議的任何類的實例:
var someGlobalVar = SomeClass()
doSomethingWith(&someGlobalVar)
如果您只使用類的實例並且該函數僅修改實例指向的對象的屬性,那么您根本不需要inout-parameter,因為類是引用類型。 您只需將協議標記為“類協議”:
protocol SomeProtocol : class {
var name : String { get set }
}
class SomeClass: SomeProtocol {
var name : String = ""
}
func doSomethingWith(someVar: SomeProtocol) {
// Modify the object:
someVar.name = "modfied"
}
var someGlobalVar = SomeClass()
doSomethingWith(someGlobalVar)
print(someGlobalVar.name) // "modified"
在聲明時將SomeClass
實例分配給變量時,變量類型被推斷為SomeClass
。 和寫作一樣
private var someGlobalVar: SomeClass = SomeClass()
但是,當傳遞給inout
參數時,該函數可以為該變量分配另一個實例,例如
private func doSomethingWith(inout someVar: SomeProtocol) {
someVar = OtherClass()
}
現在你有一個類型不匹配。 你看到的錯誤是Swift阻止你遇到類似的問題。
換句話說:如果要將變量傳遞給函數並且您知道該函數可以將任何采用SomeProtocol
實例分配給該變量,則必須使用一個實際上可以容納采用SomeProtocol
任何實例的SomeProtocol
:
private var someGlobalVar: SomeProtocol
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.