审核中 swift学习-03 从oc到swift02

323 阅读1分钟
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的内容,编译器会自动做优化

image.png

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方法
StringArray都遵守了这个协议

RangeReplaceableCollection协议包含的部分内容

append、insert、remove方法
StringArray都遵守了这个协议

DictionarySet也有实现上述协议中声明的一些方法,只是并没有遵守上述协议