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

时间:2015-08-12 08:39:43

标签: 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)

产生以下错误:

  

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

将倒数第二行更改为private var someGlobalVar: SomeProtocol = SomeClass()可解决错误。

SUBJ。

2 个答案:

答案 0 :(得分:5)

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

您可以使函数泛型

func doSomethingWith<T : SomeProtocol>(inout someVar: T) {}

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

var someGlobalVar = SomeClass()
doSomethingWith(&someGlobalVar)

如果您只使用的实例并仅使用该函数 修改实例指向的对象的属性,然后根本不需要inout-parameter,因为类是引用类型。 您只需将协议标记为&#34;类协议&#34;:

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"

答案 1 :(得分:3)

在声明时将SomeClass实例分配给变量时,变量类型推断为SomeClass。与写作相同

private var someGlobalVar: SomeClass = SomeClass()

但是,当传递给inout参数时,该函数可以将另一个实例分配给该变量,例如

private func doSomethingWith(inout someVar: SomeProtocol) {
    someVar = OtherClass()
}

现在您的类型不匹配。你看到的错误是Swift阻止你遇到类似的问题。

换句话说:如果您将一个变量传递给一个函数并且您知道该函数可以将任何采用SomeProtocol的实例分配给该变量,那么您必须使用一个实际上可以容纳任何实例的变量{ {1}}:

SomeProtocol