Swift 2.0 beta:Xcode beta 5中的协议有点破碎吗?

时间:2015-08-16 19:53:39

标签: xcode protocols swift2

目前我正在处理使用Swift 2.0编写的新应用程序。今天我在Xcode beta 5遇到了两个奇怪的错误。我喜欢拥有之前测试版Xcode的人可以确认我是否正确。我也可以误解一些东西,所以我会感激任何反馈。

以下是一些让我挣扎一段时间的示例代码:

// Frist bug
protocol SomeProtocol {

    var someArray: [String] { get set } // #1 bug
}

extension SomeProtocol {

    func someFunction(someString: String) {

        self.someArray.append(someString) // #1: Immutable value of type '[String]' only has mutating members named 'append'
    }
}

// Second bug
protocol SomeInterfaceProtocol {

    var someBool: Bool { get set } // #2 bug
}

class SomeClass: SomeInterfaceProtocol {

    var someBool: Bool = false

    func returnInterface() -> SomeInterfaceProtocol {

        return self
    }
}

let someInstance = SomeClass()

// can't set the value
someInstance.returnInterface().someBool = true // #2: Cannot assign to property: function call returns immutable value

2 个答案:

答案 0 :(得分:2)

如果你在扩展func声明之前添加修饰符mutating,可以解决第一个错误:

mutating func someFunction(someString: String) {

我怀疑语言发生了变化。

另一个也困惑我。至少,这是一个解决方法:

var c = someInstance.returnInterface()
c.someBool = true

答案 1 :(得分:2)

我认为第二个也不是错误,原因与您无法直接修改字典中的项目,或者您无法在for elem in array { ... }中更改元素。

必须保存一些东西才能更改它。因为你正在返回协议类型,编译器无法知道它是结构还是类,而如果它是结构,更改它的操作将没有任何效果,因为它不会以任何方式持久化并且结构不会被传递引用。这就是托马斯的解决方案有效的原因。如果returnInterface返回一个类实例而不是协议类型,它也可以工作。

编辑:刚试了一下:确实如果你返回SomeClass而不是SomeInterfaceProtocol或者你将协议更改为类协议,它可以工作,因为它不能是一个结构

protocol SomeInterfaceProtocol : class {
    var someBool: Bool { get set }
}

class SomeClass: SomeInterfaceProtocol {
    var someBool: Bool = false

    func returnInterface() -> SomeInterfaceProtocol {
        return self
    }
}

protocol SomeInterfaceProtocol {
    var someBool: Bool { get set }
}

class SomeClass: SomeInterfaceProtocol {
    var someBool: Bool = false

    func returnInterface() -> SomeClass {
        return self
    }
}

都工作