写在开头 iOS开发者 群532084214 给大家提供一个交流技术 也可以聊天打屁的平台
在Swift2 中 String 不在遵守
CollectionType
协议 现在的String是Character的集合体 现在操作起来就类似于Array
为什么改变虽然字符串看起来是一个字符的集合 但是他有很多不同于其他集合类型的操作 如Array Set Dictionary
和之前不同的地方
当我们想往数组里面添加一个元素 其实是数组包含了这个元素 (Dictionary Set)类似 但是对于字符串操作 不是 当我们往字符串里添加一个东西 其实字符串就发生了变化
var letters: [Character] = ["c", "a", "f", "e"]
var string: String = String(letters)
print(letters.count) // 4
print(string) // cafe
print(string.characters.count) // 4
如果你想在字符串里面添加一个字符 如 U+0301 其实这个字符串长度还是4 但是最后一个字符变成了é
let acuteAccent: Character = "\u{0301}" // ´ COMBINING ACUTE ACCENT' (U+0301)
string.append(acuteAccent)
print(string.characters.count) // 4
print(string.characters.last!) // é
这个结果和其他语言的集合类型差距非常大
根据结果我们现在猜一下原因
补充
另外一个字符串的和集合类型的区别是
集合类型是值类型 用 == 来判等 集合里面的元素完全一样 集合就相等
但是字符串不是 字符串基于基于语义和外观判等(就算unicode编码不一样) 如
这里举个韩文的意思 (我看不懂韩文)
let decomposed = "\u{1100}\u{1161}" // ᄀ + ᅡ
let precomposed = "\u{AC00}" // 가
decomposed == precomposed // true
这两句话在韩语中语义一样 所以就判等 (真是独特的语言)
Swift 虽然不是CollectionType 但是有些行为操作起来还是和CollectionType很像的
下面是一张字符在不同编码时候的对比
字符串在对比的时候是按照不同语言字符集的界定范围去比对的
详情见这里
https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/StringsAndCharacters.html#//apple_ref/doc/uid/TP40014097-CH7-ID285
网友评论