Swift基礎(chǔ)2

空合運(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")
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • importUIKit classViewController:UITabBarController{ enumD...
    明哥_Young閱讀 3,880評論 1 10
  • 關(guān)于 Swift 重要這個(gè)文檔所包含的準(zhǔn)備信息, 是關(guān)于開發(fā)的 API 和技術(shù)的。這個(gè)信息可能會改變, 根據(jù)這個(gè)文...
    無灃閱讀 4,372評論 1 27
  • 小學(xué)課本有一篇文章,內(nèi)容是作者很小的時(shí)候?qū)懥艘黄≌f(或者是詩歌,我記不太清了,管他呢),他興沖沖地拿給母親看,母...
    李瘦城閱讀 486評論 0 2
  • 若瀾看到林峰用輪椅推著妻子,又把妻子抱上樓。她本來想不再跟林峰聯(lián)系了。但又一想,林峰之所以這么多天沒有給她回微信,...
    梁繼申閱讀 434評論 0 0