String

1. str[0]

//  扩展字符串使它可以像其他语言一样以下标方式修改获取字符
extension String {
    
    //  String中的每个字符元素并不是等长的,而是由1~4个UTF-8组成,因此不能直接使用Int来索引
    func index(_ i: Int) -> Index {
        //  根据首索引和偏移计算出真实的索引
        self.index(self.startIndex, offsetBy: i)
    }
    
    subscript(_ i: Int) -> Character {
        set(newValue) {
            self.remove(at: self.index(i))
            self.insert(newValue, at: self.index(i))
        }
        get {
            return self[self.index(i)]
        }
    }
}

2. split

//  split分割
let sentence = "hello, my name is eric"
let words = sentence.split(separator: " ")
print(words)

3. join

//  joined拼接
let words = ["hello,", "my", "name", "is", "liuzihao"]
let sentence = words.joined(separator: " ")
print(sentence)

4. contains

//  是否包含
"abc".contains("a")

5. 大小写

"abcd".uppercased()

"ABCD".lowercased()

6. unicode

"abcd".unicodeScalars.forEach { (unicode) in
    print(unicode.value)
}

7. substring

//  前几位子字符串
"abcd".prefix(2)//  ab
//  后几位子字符串
"accd".suffix(2)//  cd

Swift String Length

String.count得到的是Unicode.Scalar按Unicode规则合成Character后,StringCharacter的个数。 "\r"和"\n"两个字符合成了新的单个字符"\r\n",因此字符串长度为1

"\r\n".count // 1
strlen("\r\n") // 2
"\r\n".unicodeScalars.count // 2

("🇨" + "🇳") == "🇨🇳" // true
("🇨" + "🇳").count // 1
"🇨🇳".unicodeScalars.count // 2

使用utf8和C函数一起工作

strlen("你好") // 6
"你好".utf8.count // 6

使用utf16和Objective-C函数一起工作

NSString(string: "你好").length // 2
"你好".utf16.count // 2

utf8CString

strlen("abc") // 3 (长度不包含'\0')
"abc".utf8CString // [97, 98, 99, 0]
"abc".utf8CString.count // 4 (长度包含'\0')

contains的巨坑

引入Foundation之前,contains调用的是Swift标准库;引入之后,contains调用的是Foundation中NSString的方法。 Swift完全支持Unicode,而Objective-C只支持utf-16,造成了引入前后不一样的结果

"\r\n".contains("\n") // false
"🇨🇳".contains("🇨") // false
import Foundation

"\r\n".contains("\n") // true
"🇨🇳".contains("🇨") // true