【发布时间】:2016-10-07 16:02:03
【问题描述】:
这是一个简单的游乐场示例:
class Foobar {
var name = ""
init(name:String) {
self.name = name
}
func modifyName(modification:String) {
self.name += modification
}
}
let list = [Foobar(name:"I"), Foobar(name:"Me"), Foobar(name:"Myself")]
for each in list {
each.modifyName(" rules")
}
具有name 变量的类,以及可以修改该变量的单个函数。列出它们,现在使用for in 来执行修改功能。
但是。如果我将 modifyName 变量重构为协议扩展:
class Foobar {
var name = ""
init(name:String) {
self.name = name
}
}
protocol Modifiable {
var name:String { get set }
}
extension Modifiable {
mutating func modifyName(modification:String) {
self.name += modification
}
}
extension Foobar:Modifiable { }
那么for in 将不再起作用,因为Modifiable 扩展需要将modifyName 注释为mutating。发出的错误是error: cannot use mutating member on immutable value: 'each' is a 'let' constant。有一个简单的解决方法,但感觉就像我在滥用某些东西:
for each in list {
var each = each
each.modifyName(" rules")
}
对于带有带有注释标记的参数的函数,我也遇到了同样的问题。过去,您可以在 arg 列表中使用 var 标记这些参数,但在最新版本的 swift 中已弃用。相同的单行解决方法在那里工作。有没有更好的更惯用的方法来做到这一点?最初的开始只是将一些常见的行为提取到协议扩展中,而不是继承树。感觉就像我为这个选择付出了代价。
【问题讨论】: