为何 String.CharacterView 不是 MutableCollection
本系列的其他文章: 在 上一篇文章 中,我讨论了为什么 Set 和 Dictionary 不能遵守 MutableCollection 和 RangeReplaceableCollection。今天轮到 String.CharacterView 了。 CharacterView 遵守了 RangeReplaceableCollection,但不能遵守 MutableCollection。这是为什么呢?字符串明显是可变的; 从逻辑来看它应该遵守 MutableCollection 协议。我们需要再次回过头来考虑下协议的语义。 MutableCollection 的文档制定了以下要求:
a[i] = x let y = a[i] // 必须等同于 a[i] = x let y = x 替换字符可能使索引失效用 CharacterView 尝试一下。开始有一个初始字符串 a 和一个指向 “_” 字符的索引 i ,然后用一个表情符号(新值 x)来替换它: var a = "Grinning face: _".characters let i = a.index(of: "_")! // 校验 a[i] a[i] // → "_" let x: Character = " |