人们如何处理 Swift 结构值类型 属性 的迭代?
how do people deal with iterating a Swift struct value-type property?
这里有一个明显的情况,人们必须一直出现:
struct Foundation {
var columns : [Column] = [Column(), Column()]
}
struct Column : CustomStringConvertible {
var cards = [Card]()
var description : String {
return String(describing:self.cards)
}
}
struct Card {}
var f = Foundation()
for var c in f.columns {
c.cards.append(Card())
}
该代码是合法的,但当然它对 f
没有影响,因为 var c
仍然是一个副本 — f
的实际 columns
不受影响。
我在理解 为什么 会发生这种情况方面没有任何困难。我的问题是人们通常会做什么。
很明显,我可以通过声明列 a class 而不是 struct 来解决整个问题,但是这是人们通常做的吗? (我试图遵循一种精神上的限制,即当不需要动态调度/多态性/子classing时应该避免classes;也许我说得太远了,或者也许有人们通常做的其他事情,比如以某种方式使用 inout
。)
从 Swift 4 开始,折衷方案是遍历可变集合的索引而不是元素本身,因此
for elem in mutableCollection {
// `elem` is immutable ...
}
或
for var elem in mutableCollection {
// `elem` is mutable, but a _copy_ of the collection element ...
}
变成
for idx in mutableCollection.indices {
// mutate `mutableCollection[idx]` ...
}
在你的例子中:
for idx in f.columns.indices {
f.columns[idx].cards.append(Card())
}
正如@Hamish 在评论中指出的那样,Swift 的未来版本可能会实现 mutating iteration,从而使
for inout elem in mutableCollection {
// mutate `elem` ...
}
可能。
这里有一个明显的情况,人们必须一直出现:
struct Foundation {
var columns : [Column] = [Column(), Column()]
}
struct Column : CustomStringConvertible {
var cards = [Card]()
var description : String {
return String(describing:self.cards)
}
}
struct Card {}
var f = Foundation()
for var c in f.columns {
c.cards.append(Card())
}
该代码是合法的,但当然它对 f
没有影响,因为 var c
仍然是一个副本 — f
的实际 columns
不受影响。
我在理解 为什么 会发生这种情况方面没有任何困难。我的问题是人们通常会做什么。
很明显,我可以通过声明列 a class 而不是 struct 来解决整个问题,但是这是人们通常做的吗? (我试图遵循一种精神上的限制,即当不需要动态调度/多态性/子classing时应该避免classes;也许我说得太远了,或者也许有人们通常做的其他事情,比如以某种方式使用 inout
。)
从 Swift 4 开始,折衷方案是遍历可变集合的索引而不是元素本身,因此
for elem in mutableCollection {
// `elem` is immutable ...
}
或
for var elem in mutableCollection {
// `elem` is mutable, but a _copy_ of the collection element ...
}
变成
for idx in mutableCollection.indices {
// mutate `mutableCollection[idx]` ...
}
在你的例子中:
for idx in f.columns.indices {
f.columns[idx].cards.append(Card())
}
正如@Hamish 在评论中指出的那样,Swift 的未来版本可能会实现 mutating iteration,从而使
for inout elem in mutableCollection {
// mutate `elem` ...
}
可能。