目前我正在处理使用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
答案 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
}
}
都工作