String

作者: 纳兰沫 | 来源:发表于2019-09-25 17:17 被阅读0次

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

相关文章

网友评论

      本文标题:String

      本文链接:https://www.haomeiwen.com/subject/vfkmyctx.html