String
Swift的字符串类型String,和OC的NSString,在API设计上还是有较大差异的
// 空字符串
var emptyStr1 = ""
var emptyStr2 = String()
// 拼接字符串
var str: String = "1"
str.append("_2")
// 重载运算符
str = str + "_3"
str += "_4"
// 插值
str = "\(str)_5"
print(str, str.count) // 1_2_3_4_5, 9
// 字符串的判断
var str = "123456"
print(str.hasPrefix("123")) // true
print(str.hasSuffix("456")) // true
String的插入和删除
var str = "1_2"
str.insert("_", at: str.endIndex) // 1_2_
str.insert(contentsOf: "3_4", at: str.endIndex) // 1_2_3_4
str.insert(contentsOf: "666", at: str.index(after: str.startIndex)) // 1666_2_3_4
str.insert(contentsOf: "888", at: str.index(before: str.endIndex)) // 1666_2_3_8884
str.insert(contentsOf: "hello", at: str.index(str.startIndex, offsetBy: 4)) // 1666hello_2_3_8884
str.remove(at: str.firstIndex(of: "1")!) // 666hello_2_3_8884
str.removeAll { $0 == "6" } // hello_2_3_8884
let range = str.index(str.endIndex, offsetBy: -4)..<str.index(before: str.endIndex)
str.removeSubrange(range) // hello_2_3_4
Substring
String可以通过下标、prefix、suffix等截取子串,子串类型不是String,而是Substring
var str = "1_2_3_4_5"
var substr1 = str.prefix(3) // 1_2
var substr2 = str.suffix(3) // 4_5
var range = str.startIndex..<str.index(str.startIndex, offsetBy: 3)
var substr3 = str[range] // 1_2
// 最初的String
print(substr3.base) // 1_2_3_4_5
// Substring -> String
var str2 = String(substr3)
Substring和它的base,共享字符串数据 其本质是Substring内部有一个指针指向String对应的区域 Substring发生修改或者转为String时,会分配新的内存存储字符串数据,不会影响到最初的String的内容,编译器会自动做优化
String与Character
for c in "jack" { // c是Character类型
print(c)
}
var str = "jack"
var c = str[str.startIndex] // c是Character类型
String相关的协议
BidirectionalCollection协议包含的部分内容
startIndex、endIndex属性、index方法
String、Array都遵守了这个协议
RangeReplaceableCollection协议包含的部分内容
append、insert、remove方法
String、Array都遵守了这个协议
Dictionary、Set也有实现上述协议中声明的一些方法,只是并没有遵守上述协议