空合運(yùn)算符
1.空合運(yùn)算符(a??b)將對可選類型a進(jìn)行空判斷,如果a包含一個(gè)值就進(jìn)行解封,否則就返回默認(rèn)值b。
2.這個(gè)運(yùn)算符有兩個(gè)條件:
1.表達(dá)式a必須時(shí)Optional可選類型;
2.默認(rèn)值b的類型必須要喝a存儲值的類型保持一致;
3.如果a為非空值,那么值b將不會被計(jì)算,這也就是所謂的短路求值。
let defaultValue = "0"
var price: String?
price = "100"
let result = price ?? defaultValue
print("the result is \(result)")
區(qū)間運(yùn)算符
1.閉區(qū)間運(yùn)算符(a...b) 定義一個(gè)包含從a到b(包括a和b)的所有值的區(qū)間,b必須大于等于a。
for index in 1...5 {
print("index is \(index)")
}
2.半開區(qū)間運(yùn)算符(a..<b) 定義一個(gè)從a到b但不包括b的區(qū)間,之所以稱為半開區(qū)間,是因?yàn)樵搮^(qū)間包含第一個(gè)值,而不包括最后的值。
let arr = ["one","two","three"]
for index in 0..<arr.count {
print("第 \(index) 個(gè)人叫\(zhòng)(arr[index])")
}
字符串字面量
字符串字面量是由雙引號 ("")包裹著的具有固定順序的文本字符集。字符串字面量可以用于常量和變量提供初始值。
let message = "hello wrold!"
初始化空字符串
要?jiǎng)?chuàng)建一個(gè)空字符串作為初始值,可以將空的字符串字面量賦值為變量,也可以初始化一個(gè)新的String實(shí)例:
var emptyString = ""
var anotherEmptyString = ""
我們可以通過檢查其Boolean類型的isEmpty屬性來判斷該字符串是否為空:
if emptyString.isEmpty {
print("this string is empty")
}
字符串可變性
我們可以通過將一個(gè)特定的字符串分配給一個(gè)變量來對其進(jìn)行修改,或者分配給一個(gè)常量來保證其不會被修改。
var str = "Hello"
str += " world"
//str 的值為“Hello world”
let str2 = "Hello"
str2+=" world"
//編譯失敗,str2不能被修改
note:在Objective-c和Cocoa中,我們需要通過選擇兩個(gè)不同的類NSString和NSMutableString來指定字符串是否可以被修改。
字符串是值類型
Swift的String類型是值類型。如果您創(chuàng)建了一個(gè)新的字符串,那么當(dāng)其進(jìn)行常量、變量賦值操作,或在函數(shù)/方法中傳遞時(shí),會進(jìn)行值拷貝。任何情況下,都會對已有字符串值創(chuàng)建新副本,并對該新副本進(jìn)行傳遞或賦值操作。
在實(shí)際編譯時(shí),Swift編譯器會優(yōu)化字符串的使用,使實(shí)際的賦值只發(fā)生在絕對必要的情況下,這意味著您將字符串作為值類型的同時(shí)可以獲得極高的性能。
使用字符
1.我們可以通過for-in循環(huán)來遍歷字符串中的characters屬性來獲取其中每一個(gè)字符
let str = "hello"
for character in str.characters {
print("\(character)")
}
2.通過明確表明一個(gè)Character類型并用字符字面量進(jìn)行賦值,可以創(chuàng)建一個(gè)獨(dú)立的字符常量或變量:
let c: Character = "!"
3.字符串可以通過傳遞一個(gè)值類型為Character的數(shù)組來初始化
let charArr: [Character] = ["h","e","l","l","o"]
let str = String(charArr)
print(str)
連接字符串和字符
1.字符串可以通過加法運(yùn)算符(+)相加在一起創(chuàng)建一個(gè)新的字符串;
let x = "xxxx"
let y = "yyyy"
//z的值為“xxxxyyyy”
let z = x + y
2.字符串可用通過加法賦值運(yùn)算符(+=) 將一個(gè)字符串添加到一個(gè)已存在的字符串變量上;
var x = "xxxx"
var y = "yyyy"
//x的值為“xxxxyyyy”
x += y
3.我們可以使用append()方法將一個(gè)字符附加到一個(gè)字符串變量的尾部;
let char: Character = "!"
var message = "hello world"
//message的值為“hello world!”
message.append(char)
字符串插值
字符串插值是一種構(gòu)建新字符串的方式,可以在其中包含常量、變量、字面量和表達(dá)式。
插值字符串中寫在括號中的表達(dá)式不能包含非轉(zhuǎn)義反斜杠(),并且不能包含回車或者換行符。不過,插值字符串可以包含其他字面量。
var x = 12
var y = 3
var str = "x + y = \(x + y)"
字符串索引
1.不同的字符可能會占用不同數(shù)量的內(nèi)存空間,所以要知道Character的確定位置,就必須從String開頭遍歷每一個(gè)Unicode字符直到結(jié)尾。因此,Swift的字符串不能使用整數(shù)來做索引。
2.使用startIndex屬性可以獲取一個(gè)String的第一個(gè)Character的索引。使用endIndex屬性可以獲取最后一個(gè)Character的后一個(gè)位置的索引。因此,endIndex屬性不能作為一個(gè)字符串的有效下標(biāo)。如果String為空,那么 startIndex和endIndex是相等的。
3.通過調(diào)用String.index的predecessor()方法,可以立即得到前面一個(gè)索引,調(diào)用successor()方法可以立即得到后面一個(gè)索引。任何一個(gè)String的索引都可以通過鎖鏈的作用的這些方法獲取另一個(gè)索引,也可以調(diào)用advancedBy(_:)方法來獲取。但如果嘗試獲取出界的字符串索引,那么久會拋出一個(gè)運(yùn)行時(shí)錯(cuò)誤。
et greeting = "Guten Tag!"
greeting[greeting.startIndex]
//G
greeting[greeting.endIndex.predecessor()]
//!
greeting[greeting.startIndex.successor()]
//u
let index = greeting.startIndex.advancedBy(7)
greeting[index]
//a
4.試圖獲取越界索引對應(yīng)的Character,將引發(fā)一個(gè)運(yùn)行時(shí)錯(cuò)誤。
5.使用characters屬性的indeices屬性會創(chuàng)建一個(gè)包含全部索引的范圍,用來在一個(gè)字符串中訪問單個(gè)字符。
let greeting = "Guten Tag!"
for index in greeting.characters.indices {
print("\(greeting[index])")
}
插入和刪除
1.調(diào)用insert(_:atIndex:) 方法可以在一個(gè)字符串的指定索引插入一個(gè)字符。
var message = "hello"
message.insert("!", atIndex: message.endIndex)
//hello!
2.調(diào)用insertContentsOf(_:at:)方法可以在一個(gè)字符串指定索引插入多個(gè)字符(即字符串)。
var message = "hello"
message.insertContentsOf(" world!".characters, at: message.endIndex)
//hello world!
3.調(diào)用removeAtIndex(_:)方法可以在一個(gè)字符串的指定索引刪除一個(gè)字符
var message = "hello"
message.removeAtIndex(message.endIndex.predecessor())
print(message)
//hell
4.調(diào)用remvoeRange(_:)方法可以在一個(gè)字符串的指定范圍刪除一個(gè)子字符串
var message = "hello"
let range = message.endIndex.advancedBy(-3)..<message.endIndex
message.removeRange(range)
print(message)
//he
字符串/字符相等
1.字符串/字符可以用等于操作符(==)和不等于操作符(!=)。如果兩個(gè)字符串(或者兩個(gè)字符)的可擴(kuò)展的字形集是標(biāo)準(zhǔn)相等的,那就認(rèn)為它們是相等的。在這個(gè)情況下,即使可擴(kuò)展的字形群集是有不同的unicode標(biāo)量構(gòu)成的,只要它們有同樣的語言意義和外觀,就認(rèn)為它們標(biāo)準(zhǔn)相等。
let x = "123456"
let y = "123456"
x == y
//true
前綴與后綴
通過調(diào)用字符串的hasPrefix(_ :) 和 hasSuffix(_:) 方法來檢查字符串是否擁有特定的前綴和后綴,兩個(gè)方法均接受一個(gè)String類型的參數(shù),并返回一個(gè)布爾值。
let x = "NSObject"
x.hasPrefix("NS")
x.hasSuffix("ct")