特性:
?1. Unicode 編碼規(guī)范: 可以使用任何字符仑撞,表情
?2. 與本地語(yǔ)言無關(guān):無需去考慮漢子及其他字體亂碼以及轉(zhuǎn)碼問題
?3. 高效
?4. 值類型:無論作為參數(shù)傳遞還是復(fù)制給別的常量或變量都會(huì)copy一份(是否真正copy一份在內(nèi)存中取決于編譯器的優(yōu)化決定)
?5. 與 NSString 兼容
?String 的初始化方式
?使用字符串常量值初始化
var str = ""
var str1 = "Hello, playground"
? 使用 init 方法初始化??
1. 字符串常量值初始化
? ?// str3, str4 效果與str, str1 效果相同队伟,
?let str3 = String()
let str4 = String("Hello, playground")?
? 2. charater及數(shù)組初始化
? let ch:Character = "A"
let str5 = String(ch)let catCharacters: [Character] = ["C", "a", "t", "!", "??"]
let catString = String(catCharacters)
? 3. CharacterView 作為參數(shù)初始化
? ? String 的 CharacterView 屬性是一個(gè)擴(kuò)張字符簇的集合,它近似于人的可讀字符幽勒。一些獨(dú)立的字符嗜侮,? ? ? ? 如é”, “?”, and “???? 是由多個(gè)unicode 代碼點(diǎn)組成,é(e\u{301}), 這些代碼點(diǎn)通過Unicode的邊界算法組? ? ? ? 合成擴(kuò)張字符簇中的字符啥容,這個(gè)字符就是swift 中的Charater類型锈颗,CharacterView 中的每一個(gè)元素就? ? ? ? 是一個(gè)Charater, 我們可以把CharacterView 看做是Charater的一個(gè)集合
? let poem = "'Twas brillig, and the slithy toves / " +? ? "Did gyre and gimbal in the wabe: / " +? ? ? ? "All mimsy were the borogoves / " +? ? ? ? "And the mome raths outgrabe."
? let result = poem.characters?
? ? ? print(result)?
? 輸出結(jié)果 :CharacterView(_core: Swift._StringCore(_baseAddress: Optional(0x0000600000177de0), _countAndFlags: 132, _owner: Optional(Swift._HeapBufferStorage)))
我們可以把這個(gè)結(jié)果轉(zhuǎn)成數(shù)組? print(Array (result))
let excerpt = String(poem.characters.prefix(22)) + "..." // charaterView 初始化
print(excerpt)
CharacterView 只是swift中的一種編碼形式,還有其他三種
?Unicode Scalar View
String 的 unicodeScalars 屬性是unicode 標(biāo)量的集合咪惠,基本的unicode占21個(gè)比特位击吱。每一個(gè)unicodeScalar表示的標(biāo)量等同于UTF-32。
?UTF-16 View:
String 的 utf16 屬性是一個(gè)utf-16的編碼集遥昧,每一個(gè)編碼單元都是一個(gè)utf-16實(shí)例覆醇,占據(jù)16bit。在OC中炭臭,NSString的編碼方式就是utf16
?UTF-8 View
String 的 utf8 屬性是一個(gè)utf-8的編碼集永脓,每一個(gè)編碼單元都是一個(gè)utf-8實(shí)例 占據(jù)8bit。當(dāng)把String實(shí)例傳給c APIs時(shí)使用的就是這種編碼形式鞋仍。
不同的字符編碼形式所占的空間不同所以每一個(gè)編碼單元所能表示的范圍也不同常摧,同一個(gè)字符串在不同的編碼形式下會(huì)有不同的存儲(chǔ)形式,會(huì)有不同的長(zhǎng)度凿试。
let cafe = "Cafe\u{301} du ??"
print(Array(cafe.characters))
print(cafe.unicodeScalars.map { $0.value })
print(Array(cafe.utf16))
print(Array(cafe.utf8))
結(jié)果:`
["C", "a", "f", "e?", " ", "d", "u", " ", "??"]
[67, 97, 102, 101, 769, 32, 100, 117, 32, 127757]
[67, 97, 102, 101, 769, 32, 100, 117, 32, 55356, 57101]
[67, 97, 102, 101, 204, 129, 32, 100, 117, 32, 240, 159, 140, 141]
?從文件中初始化
do {
let abc = try String(contentsOfFile:"123", encoding:String.Encoding.utf8)
print(abc)
} catch? {
}
?長(zhǎng)度計(jì)算
通過 character.count 計(jì)算字符串的長(zhǎng)度排宰,由于字符串采用的是擴(kuò)張的字符集, 所以在一些情況下即使發(fā)生了修改其長(zhǎng)度也可能不會(huì)這化
var word = "cafe"
print("the number of characters in \(word) is \(word.characters.count)")
// Prints "the number of characters in cafe is 4"
word += "\u{301}"? ? // COMBINING ACUTE ACCENT, U+0301
print("the number of characters in \(word) is \(word.characters.count)")
// Prints "the number of characters in cafe? is 4”
訪問和修改字符串
就像我們上面提到的那婉,String在不同的編碼下所占的內(nèi)存空間是完全不同的板甘,所以我們無法通過一個(gè)整型的下標(biāo)值來定位一個(gè)字符的位置,如果想要通過下標(biāo)來訪問這樣的方式來訪問详炬,我們就要用到String.Index盐类。
startIndex: 第一個(gè)字符所在的位置
endIndex:? 最后一個(gè)字符的下一位所在的位置
var str = "Cafe\u{301} du ??"
print(str.characters.count)
print(str[str.startIndex])
print(str[str.index(after: str.startIndex)])
let index = str.index(before: str.endIndex)
print(str[index])
如果想改變?cè)址褂胊ppend
var a = "Hello"
a.append("abc")
print(a) // Helloabc
a 必須是變量
通過after 和before可以找到當(dāng)前Index的上個(gè)位置或下一個(gè)位置.
let index = str.index(str.startIndex, offsetBy: 5)
print(str[index])
如果采用上面的方法,當(dāng)結(jié)果超出endIndex 時(shí)就會(huì)報(bào)錯(cuò)呛谜,我們可以采用下面的方法來防止這樣的錯(cuò)誤發(fā)生在跳,如果超出時(shí)就返回nil
let indexN = str.index(str.startIndex, offsetBy: 20, limitedBy: str.endIndex)
查找字符串的位置:
let index = str.characters.index(of: "a");
//查找第一個(gè)大寫字母
let greeting = "hello, friEnd!"
if let i = greeting.characters.index(where: { $0 >= "A" && $0 <= "a" }) {
print("First capital letter: \(greeting[i])")
}
連接,格式化
連接兩個(gè)字符串隐岛,并生成一個(gè)新的字符串
let a = "Hello"
let b = "World"
let c = a + b
print(a)? //? Hello
print(b)? // World
print(c) // HelloWorld
let? count = 10;
let result = "The result is \(count)"
print(result)