Swift-String
关于String的思考
- 一个String变量战胜多少内存?
- 下面两个String变量,底层存储有什么不同?
1
2var str1 = "0123456789"
var str2 = "0123456789ABCDEF" - 如果对String进行拼接操作,String变量的存储会发生什么变化?
1
2
3
4
5str1.append("ABCDE")
str1.append("F")
str1.append("G")
分析
1 | // 字符串长度 <= 0xF(16位),字符串内容直接存放在str1变量的内存中 |
常规定义
- Swift的字符串类型String,跟OC的NSString,在API设计上还是有较大差异
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19// 空字符串
var emptyStr1 = ""
var emptyStr2 = String()
var str: String = "1"
// 拼接,jack_rose
str.append("_2")
// 重载运算符 +
str = str + "_3"
// 重载运算符 +=
str += "_4"
// \()插值
str = "\(str)_5"
// 长度,9,1_2_3_4_5
print(str.count)
var str = "123456"
print(str.hasPrefix("123")) // true
print(str.hasSuffix("456")) // true
String的插入和删除
1 | var str = "1_2" |
SubSting
- String可以通过下标、prefix、suffix等截取子串,子串类型不是String,而是Substring
1
2
3
4
5
6
7
8
9
10
11
12var str = "1_2_3_4_5"
// 1_2
var substr1 = str.prefix(3)
// 4_5
var substr2 = str.suffix(3)
// 1_2
var range = str.startIndex..<str.index(str.startIndex, offsetBy: 3)
var substr3 = str[range]
// 最初的String,1_2_3_4_5
print(substr3.base)
// Substring -> String
var str2 = String(substr3) - Substring和它的base,共享字符串数据
- Substring发生修改 或者 转为String时,会分配新的内存存储字符串数据
String与Character
1 | for c in "jack" { // c是Character类型 |
String相关的协议
- BidirectionalCollection 协议包含的部分内容
- startIndex、endIndex 属性、index 方法
- String、Array 都遵守了这个协议
- RangeReplaceableCollection 协议包含的部分内容
- append、insert、remove 方法
- String、Array 都遵守了这个协议
- Dictionary、Set 也有实现上述协议中声明的一些方法,只是并没有遵守上述协议
多行String
1 | let str = """ |
String 与 NSString
- String 与 NSString 之间可以随时随地桥接转换
- 如果觉得String的API过于复杂难用,可以考虑将String转为NSString
1
2
3
4
5
6
7
8
9var str1: String = "jack"
var str2: NSString = "rose"
var str3 = str1 as NSString
var str4 = str2 as String
// ja
var str5 = str3.substring(with: NSRange(location: 0, length: 2))
print(str5) - 比较字符串内容是否等价
- String使用 == 运算符
- NSString使用isEqual方法,也可以使用 == 运算符(本质还是调用了isEqual方法)
Swift、OC桥接转换表
1 | String ⇌ NSString |
参考
李明杰老师课件
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 ivan's Blog!
评论









