String的插入和删除
var str = "1_2"
str.insert("_", at: str.endIndex)
print(str,str.count,str.startIndex,str.endIndex)
str.insert("_", at: str.startIndex)
print(str,str.count,str.startIndex,str.endIndex)
str.insert(contentsOf: "3_4", at: str.startIndex)
print(str,str.count,str.startIndex,str.endIndex)
str.insert(contentsOf: "666", at: str.index(after: str.startIndex))
print(str,str.count,str.startIndex,str.endIndex)
str.insert(contentsOf: "888", at: str.index(before: str.endIndex))
print(str,str.count,str.startIndex,str.endIndex)
str.insert(contentsOf: "hello", at: str.index(str.startIndex, offsetBy: 4))
print(str,str.count,str.startIndex,str.endIndex)
1_2_ 4 Index(_rawBits: 0) Index(_rawBits: 262144)
_1_2_ 5 Index(_rawBits: 0) Index(_rawBits: 327680)
3_4_1_2_ 8 Index(_rawBits: 0) Index(_rawBits: 524288)
3666_4_1_2_ 11 Index(_rawBits: 0) Index(_rawBits: 720896)
3666_4_1_2888_ 14 Index(_rawBits: 0) Index(_rawBits: 917504)
3666hello_4_1_2888_ 19 Index(_rawBits: 0) Index(_rawBits: 1245184)
str.remove(at: str.firstIndex(of: "1")!)
print(str,str.count,str.startIndex,str.endIndex)
//删除是6的字符
str.removeAll { $0 == "6"
}
print(str,str.count,str.startIndex,str.endIndex)
//删除区间
var range = str.index(str.endIndex, offsetBy: -4) ..< str.index(before: str.endIndex)
str.removeSubrange(range)
print(str,str.count,str.startIndex,str.endIndex)
3666hello_4__2888_ 18 Index(_rawBits: 0) Index(_rawBits: 1179648)
3hello_4__2888_ 15 Index(_rawBits: 0) Index(_rawBits: 983040)
3hello_4__2_ 12 Index(_rawBits: 0) Index(_rawBits: 786432)
SubString
String可通过下标 prefix suffix等截取子串 子串类型不是String 是SubString
var subStr1 = str.prefix(3)
print(subStr1)
var subStr2 = str.suffix(3)
print(subStr2)
var range = str.startIndex ..< str.index(str.startIndex, offsetBy: 4)
var subStr3 = str[range]
print(subStr3)
//最初的String
print(subStr3.base)
//SubString -> String
var str2 = String(subStr3)
SubString 和 String公用一份内存 只不过SubString 的指针有区域指向对应的位置,但是如果对SubString 进行 String转换 那么就会生成一份新的内存存放SubString里面的内容
如果对SubString 进行append操作 那么SubString 会产生一份新的内存存放内容 不会影响到原先的String
var str = "123456"
var range = str.startIndex ..< str.index(str.startIndex, offsetBy: 4)
var subStr3 = str[range]
print(subStr3)
subStr3.append(contentsOf: "dasa")
print(str)
123456
SubString发生修改 或者 转为String时 会分配新的内存存储字符串数据
String 和 Character
for c in "jack" {
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 也有实现上述方法 只不过没有遵守协议
多行String
let str = """
1
"2"
3
"4"
"""
print(str)
1
"2"
3
"4"
缩进以最后的3引号为标准
String 和 NSString
1.String 和 NSString之间可以随时随地桥接转换
2.String 不能 桥接转换成 NSMutableString 说的是直接转换 也就是使用as方法,但是 如果是使用NSMutableString(string: str)这样的方法是可以实现String 转换成 NSMutableString的
比较字符串内容是否等价
1.String使用==运算符
2.NSString使用isEqual方法 也可以使用==运算符 (本质还是调用了isEqual方法)
Swift OC桥接转换表.png
网友评论