一、String与OC字符串转换
Swift中的String使用方法跟OC有很大的不同,先介绍一下String和OC字符串的转换方式,有时为了方便可以转为OC的字符串来使用。
func testStrTransform() {
// 1. NSString和String的转换,使用as
let str: String = "String"
let str2: NSString = "NSString"
let str3 = str as NSString // NSString
let str4 = str2 as String
print(str3, str4)//String NSString
/* 2. NSMutableString转换为String,用as;但String不能as转为NSMutableString。
* NSMutableString是NSString的子类,NSString可以转换String,所以NSMutableString也可以;
* 但是String不能转为NSString的子类NSMutableString去使用。
*/
let mutStr = NSMutableString(string: "NSMutableString")
let mutStr2 = mutStr as String // NSMutableString修改了,String不会跟着改
// let mutStr3 = mutStr2 as NSMutableString// 编译报错
mutStr.append("--append")
print(mutStr, mutStr2)//NSMutableString--append NSMutableString
// 3. String要变为NSMutableString,需要调用初始化方法。
let strToMut = "String"
let strToMut2 = NSMutableString(string: strToMut)
// 调用as?转换结果是nil,因为转换不会成功。所以strToMut3的结果是默认值
let strToMut3: NSMutableString = strToMut as? NSMutableString ?? "默认值"
strToMut3.append("--apend")
print(strToMut, strToMut2, strToMut3)
}
二、String中的Index、Range
String
遵守了BidirectionalCollection
协议, 协议中有startIndex
和endIndex
之类跟索引相关的属性、方法。在String
中索引的类型是特有的String.Index
, 我们应该将它当做一个特别的索引类型,不能当做是Int来使用。
func testStrIndex() {
// 一、字符串索引
let str = "abcdefg"
let start = str.startIndex
let end = str.endIndex // str[end]会奔溃,因为end已经是最后一个
let start1 = str.index(after: start)
let start2 = str.index(start, offsetBy: 2)// start之后的第2个元素索引
let end1 = str.index(before: end)// str[end1]取出的是最后一个字符
let end2 = str.index(end, offsetBy: -2)// str[end2]取出的是倒数第2个字符
// 1.通过索引来取出对应位置的字符,Character
let aaa = str[start1]
print(str[start] ,str[start1], str[start2], str[end1], str[end2], "-----")
// 2.可通过last和first来取首尾字符,不会出现越界奔溃
print(str.last, str.first)
}
String
中可以通过索引来定义区间Range,然后通过区间来取子串。
// 1.两个字符串的Index来初始化一个区间Range
let range = start..<end
// 2.通过range从字符串中取出一个子串,str[range]是String.SubSequence类型
print(str[range], "-----")
三、String中增加、插入、删除
String
遵守了RangeReplaceableCollection
协议,实现了append
、insert
、delete
之类方法。
func testStrRangeReplaceable() {
// 1.append追加字符串
var greeting = "Hello, " // 需要是可变字符串
greeting.append("friend")
print(greeting) // Hello, friend
// 2.insert插入字符串
// 插入一个字符Character类型
greeting.insert("x", at: greeting.index(greeting.startIndex, offsetBy: 6))
print(greeting)
// 插入一个字符串
greeting.insert(contentsOf: "-chinese", at: greeting.index(greeting.startIndex, offsetBy: 7))
print(greeting)// Hello,x-chinese friend
// 3.replaceSubrange替换range中的字符串
let index1 = greeting.index(greeting.startIndex, offsetBy: 6)
let index2 = greeting.index(greeting.startIndex, offsetBy: 15)
greeting.replaceSubrange(index1..<index2, with: "iran")
print(greeting)// Hello,iran friend
// 4.remove来移除部分元素
// 移除所有的"r"字符
greeting.removeAll { chracter in
chracter == "r"
}
print(greeting)// Hello,ian fiend
greeting.removeFirst() // 移除第一个字符
print(greeting)// ello,ian fiend
greeting.removeFirst(3) // 移除前3个字符
print(greeting) // o,ian fiend
// greeting.removeLast()// 移除最后一个字符
// 移除一个范围内的字符串
let index11 = greeting.index(greeting.startIndex, offsetBy: 2)
let index22 = greeting.index(greeting.startIndex, offsetBy: 4)
greeting.removeSubrange(index11..<index22)
print(greeting) // o,n fiend
}
四、String的子串SubString
我们通过prefix
、suffix
、str[range]
获取到的子字符串类型是Substring
.
func testSubstring() {
var str = "1_2_3_4_5"
// 下面方式取的字符串都是Substring类型
// 取出前3个字符
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"
// SubString都有一个base,指向最初的字符串
print(subStr3.base) //1_2_3_4_5
// SubString转为String
var str2 = String(subStr3)//"1_2"
}
Substring
类型和它的base
原始字符串是共享一段内存的,Substring
只是指向了base
的一段内存;当Substring
转为String时,才会开辟新的存储空间。