Swift 字符串String的常見(jiàn)用法

字符串是是一系列字符的集合,Swift中的字符串通過(guò) String 類(lèi)型來(lái)表示。 一個(gè) String 的內(nèi)容可以用許多方式讀取,包括作為一個(gè) Character 值的集合。

Swift 的 String 類(lèi)型與 Foundation NSString 類(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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容