字符串是是一系列字符的集合,Swift中的字符串通過(guò) String 類(lèi)型來(lái)表示。 一個(gè) String 的內(nèi)容可以用許多方式讀取,包括作為一個(gè) Character 值的集合。
Swift 的
String類(lèi)型與 FoundationNSString類(lèi)進(jìn)行了無(wú)縫橋接。Foundation 也可以對(duì)String進(jìn)行擴(kuò)展,暴露在NSString中定義的方法。 這意味著,如果你在String中調(diào)用這些NSString的方法,將不用進(jìn)行轉(zhuǎn)換。
字符串的表示可以是一對(duì) "" 雙引號(hào)
let someString = "Some string literal value"
多行字符串用一對(duì) """~"""三引號(hào),多行字符串不會(huì)對(duì)其中的轉(zhuǎn)義字符處理
let someString = """
The White Rabbit put on his spectacles. "Where shall I begin,
please your Majesty?" he asked.
"Begin at the beginning," the King said gravely, "and go on
till you come to the end; then stop."
""" // 原樣輸出
創(chuàng)建字符串
通過(guò)字面量,創(chuàng)建
//字面量創(chuàng)建 var 修飾 可變
var string = "Literal"
var nullString = "" //空串
// 構(gòu)造方法 let 修飾 不可變
let string = String("ss")
let nullString = String() //空串
用C字符串創(chuàng)建
//swift中不能直接寫(xiě)C語(yǔ)言,需要用到swift指針
var validUTF8:[UInt8] = [97,98,99,100,0]
var uint8String = String(cString: validUTF8)
print(uint8String)
//蘋(píng)果推薦的做法
let validUTF8: [CChar] = [67, 97, 102, -61, -87, 0]
validUTF8.withUnsafeBufferPointer { ptr in
let s = String(cString: ptr.baseAddress!)
print(s)
}
字符串格式化
//format格式和OC中一致
單個(gè)變量format
var floatNum:Float = 5.0
var formatString1 = String(format: "float:%f", arguments: [floatNum])
var formatString2 = String(format: "float:%f", arguments: [5.0])
字符串用%@
var name = String("lili")
var formatString3 = String(format: "swift:%@", arguments: [name])
多個(gè)變量
var formatString3 = String(format: "float:%f-%d-%c", arguments: [5.0,2,97])
//或者
var formatString = String(format: "format string:%d-%.2f-%c",11,5.0,97)
字符串插值
var interpolationString = "interpolation:\(floatNum):String"
print(interpolationString)//interpolation:5.0:String
字符串拼接,插值,格式化都可以實(shí)現(xiàn)拼接效果
// 通過(guò) appending(:)
let string1 = "name"
var string2 = "age"
var string = string2.appending(string1)
//等效的寫(xiě)法 ,+
let string1 = "name"
let string2 = "age"
var string = string1 + string2
//字符串插值
var string = "\(string2)\(string1)"
//格式化
var string = String(format: "%@%@", arguments: [string1,string2])
Index
字符串索引String.Index
swift中的字符串不能直接通過(guò)下表[]整數(shù)的形式訪問(wèn)
var line = "I want magic"
line[0]// 編譯報(bào)錯(cuò)
indices 屬性會(huì)創(chuàng)建一個(gè)包含全部索引
for i in line.indices{
print(line[i])// OK的
}
除此之外,index(_:offsetBy:)獲取指定位置的索引
var version = "10.11.12"
//對(duì)于一個(gè)確定的字符串,能直接獲取到它的startIndex,endIndex
//endIndex 是最后一個(gè)字符之后的索引
var prefixIndex = version.startIndex
var suffixIndex = version.endIndex
//獲取 第二個(gè)索引
var secondIndex = version.index(prefixIndex, offsetBy: 2)
//獲取倒數(shù)第二個(gè)索引
var reversalSecondIndex = version.index(suffixIndex, offsetBy: -2)
//當(dāng)前索引的下一個(gè)
var afterIndex = version.index(after: prefixIndex)
//如果超出限制,返回nil
var maxIndex = version.index(prefixIndex, offsetBy: 100, limitedBy: suffixIndex)
//獲取任意字符的索引,返回可選
var index = line.firstIndex(of: "0") ?? line.endIndex
有了String.Index字符串截取,通過(guò)下標(biāo)[]運(yùn)算訪問(wèn)
//substring(to:)已棄用
//從首位到索引位置的字符串
print(version.substring(to: secondIndex))//10
print(version.substring(to: reversalSecondIndex))//10.11.
print(version.substring(to: afterIndex))//1
//倒數(shù)到索引位置的字符串
//substring(from:)已棄用
print(version.substring(from: secondIndex))//.11.12
print(version.substring(from: reversalSecondIndex))// 12
print(version.substring(from: afterIndex))// 0.11.12
// range 注意區(qū)間右邊越界 suffixIndex 是最后一個(gè)字符之后的索引
print(version[secondIndex]) // .
print(version[prefixIndex..<suffixIndex]) //"10.11.12"
print(version[prefixIndex...suffixIndex]) //越界 異常
print(version[secondIndex...reversalSecondIndex])//.11.1
print(version[index]) // 0
print(version[...index])//10
print(version[index...])//0.11.12
print(line[...])//10.11.12
字符串替換,刪除,插入
// : 替換 -
var time = "2021:1:1"
var newTime = time.replacingOccurrences(of: ":", with: "-")
print(newTime)//2021-1-1
// 刪除 用空字符代替
var newTime1 = time.replacingOccurrences(of: ":", with: "")
//替換一段字符
var strat = time.index(time.startIndex, offsetBy: 4)
var end = time.index(time.startIndex, offsetBy: 5)
var newTime2 = time.replacingCharacters(in: strat..<end, with: "AAAA")
print(newTime2)//2021AAAA1:1
// 刪除 單個(gè)字符
time.remove(at: time.index(time.startIndex, offsetBy: 4))
print(time)//20211:1
//刪除一段字符
time.removeSubrange(time.range(of: "2021")!) //:1:1
time.removeSubrange(time.startIndex..<time.endIndex)// 空字符串
//等效寫(xiě)法
time.removeAll()
插入字符 insert(_:at:)
//在指定索引 前面 插入字符
time.insert("A", at: strat)
插入字符串 insert(contentsOf:at:)
//在指定索引 前面 插入多個(gè)字符
time.insert(contentsOf: "BBBB", at: strat)
過(guò)濾trimmingCharacters(in:)會(huì)對(duì)字符串的開(kāi)頭和結(jié)尾過(guò)濾處理
var time = " 2021:1:1 "
//過(guò)濾前后空格
var nowhitespaces = time.trimmingCharacters(in: .whitespaces)
// 20BBBB21:1:1
//filter
time.filter { $0.isNumber }
// 202111
由于字符串遵守Sequence協(xié)議,所以Sequence系列方法也都適用
字符串分割
split根據(jù)單個(gè)字符分割
// 按照 : 分割 返回?cái)?shù)組
var sp = time.split(separator: ":")//["UTC BBBB2021-01-28 02", "39", "40 +0000"]
//根據(jù)滿(mǎn)足條件的字符,分割 返回?cái)?shù)組
var sp1 = time.split {$0.isNumber}//["UTC BBBB", "-", "-", " ", ":", ":", " +"]
//根據(jù) 空格分割 限制最大分割次數(shù)maxSplits
var sp2 = time.split(separator: " ", maxSplits: 1, omittingEmptySubsequences: true)
print(sp2)//["UTC", "BBBB2021-01-28 02:39:40 +0000"]
//omittingEmptySubsequences = false 返回的集合包含 空字符符
var time = "UTC 2021-01-28 02:39:40 +0000"
var sp5 = time.split(maxSplits: 100, omittingEmptySubsequences: false) {$0.isWhitespace}
print(sp5)//["UTC", "BBBB2021-01-28", "", "", "", "", "", "", "", "", "", "", "02:39:40", "+0000"]
components根據(jù) 子串 分割
//根據(jù) magic 子串 分割
let line = "I want magic I want magic I want magic I want magic I want magic"
line.components(separatedBy: "magic")
//["I want ", " I want ", " I want ", " I want ", " I want ", ""]
//自定義字符集CharacterSet
line.components(separatedBy: CharacterSet.init(charactersIn: "It"))
//["", " wan", " magic ", " wan", " magic ", " wan", " magic ", " wan", " magic ", " wan", " magic"]
如果是從前綴開(kāi)始或者后綴截取字符串,可以通過(guò)prefix(:)和suffix(:)
line. prefix(5) // I want
line.suffix(5) // magic
子字符串SubString
通過(guò)下標(biāo)[],等方法會(huì)得到一個(gè)SubString類(lèi)新的字符串,在沒(méi)有對(duì)原字符串寫(xiě)操作之前,它會(huì)復(fù)用原String的內(nèi)存空間,因此SubString 不適合長(zhǎng)期存儲(chǔ),最好轉(zhuǎn)換成String保存
var subIndex = line.index(line.startIndex, offsetBy: 4)
var subLine = line[line.startIndex...subIndex] //subString
let newString = String(subLine)//String