是否禁止使用协议类型的变量?

mes*_*ngr 3 swift swift2 xcode7-beta5

以下代码:

protocol SomeProtocol {}
class SomeClass: SomeProtocol {}

private func doSomethingWith(inout someVar: SomeProtocol) {}

private var someGlobalVar = SomeClass() // inferring SomeClass's type

doSomethingWith(&someGlobalVar)
Run Code Online (Sandbox Code Playgroud)

产生以下错误:

无法使用类型'(inout SomeClass)的参数列表调用'doSomethingWith'

更改倒数第二行以private var someGlobalVar: SomeProtocol = SomeClass()解决错误.

SUBJ.

Mar*_*n R 5

除了@Sulthan所说的,还有两种可能的解决方案,具体取决于您的功能需要做什么.

您可以使函数通用:

func doSomethingWith<T : SomeProtocol>(inout someVar: T) {}
Run Code Online (Sandbox Code Playgroud)

现在您可以传递符合协议的任何类的实例:

var someGlobalVar = SomeClass()
doSomethingWith(&someGlobalVar)
Run Code Online (Sandbox Code Playgroud)

如果您只使用类的实例并且该函数仅修改实例指向的对象的属性,那么您根本不需要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"
Run Code Online (Sandbox Code Playgroud)