簡體   English   中英

是否禁止使用協議類型的變量?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM