一、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時,纔會開闢新的存儲空間。