assert(條件谓娃,斷言信息)
斷言被觸發(fā)時則應(yīng)用終止
空合運算符(a??b)對可選變量a進行空判斷,如果a包含一個值就進行解封蜒滩,否則返回一個默認值b滨达。
表達式a必須是一個可選變量
b的類型要和a存儲值的類型保持一致
相當于a!=nil?a!:b
區(qū)間運算符
for index in 1...5{
print("\(index) * 5 = \(index * 5)")
}
字符串變量可通過isEmpty屬性來判斷該字符串是否為空
常量字符串不可以被修改
String類型是值類型,任何情況下俯艰,進行操作時都會對已有字符串值創(chuàng)建新副本
可遍歷字符串中的charaters屬性來獲取每一個字符的值
let catCharacters:[Character] = ["C","a","t","!","?"]
let catString = String(catCharacters)
print(catString)
字符串插值即可以是一個整形的變量a作為\(a)被插入到一個字符串常量中捡遍。
Unicode是一個國際標準,用于文本的編碼和表示竹握。
字符串字面量的特殊字符: \"雙引號
可若站的字符群集作為Character值來連接或者改變字符串是画株,并不一定會更改字符串的字符數(shù)量
可擴展的字符群集可以組成一個或者多個Unicode標量,這意味著不同的字符以及相同字符的不同表示方式可能學要不同數(shù)量的內(nèi)存空間來存儲,所以Swift中的字符在一個字符串中并不一定占用相同的內(nèi)存空間數(shù)
每一個String的值都有一個關(guān)聯(lián)的索引類型谓传,String.index蜈项,它對應(yīng)著字符串中的每一個Character的位置
endIndex對應(yīng)的是獲取String最后一個Character的后一個位置的索引
let greeting = "Guten Tag!"
greeting[greeting.startIndex]//G
greeting[greeting.index(before:greeting.endIndex)] ?//!//index(before:)
greeting[greeting.index(after:greeting.startIndex)] //u//index(after)
let index = greeting.index(greeting.startIndex,offsetBy:7)//index(_:offsetBy)
greeting[index] ? //a
使用characters屬性的indices屬性會創(chuàng)建一個包含全部索引的范圍
for index in greeting.characters.indices{
print("\(greeting[index])",terminator:"")
}
插入和刪除
insert(contentsOf: ? ?,at: ? ? ? )
remove(at: ? ?)
let range = welcome.index(welcome.endIndex,offsetBy:-6)..<weicome.endIndex
welcome.removeSubrange(range)
可用hasPrefix()來計算包含前綴的字符串數(shù)
可用hasSuffix()來計算包含后綴的字符串數(shù)
創(chuàng)建一個帶默認值的數(shù)組:var threeDouble = Array(repeating:0.0,coutnt:3)
可通過加法運算符來組合兩種已存在的相同類型數(shù)組
創(chuàng)建一個空數(shù)組:var a = [Int]()
用數(shù)組字面量構(gòu)造數(shù)組
var shop:[String] = ["Eggs","Milk"]
可用布爾屬性isEmpty檢查count屬性是否為0
還可以利用下標一次改變一系列數(shù)據(jù)值:a[4...6] = [1,2]
可用insert(content, at: num)插在具體表項之前
remove(at:)移除數(shù)組中的某一項并返回這個被移除的數(shù)據(jù)項,移除最后一項用removeLast()
集合用來存儲相同類型并且沒有確定順序的值续挟,并且確保每個元素值出現(xiàn)一次
創(chuàng)建一個空集合:var letters = Set<Character>()
數(shù)組字面量創(chuàng)建集合
var favoriteGenres:Set<String> = ["Rock","Classical","Hip hop"]
Set類型不能從數(shù)組字面量中被單獨推斷出來紧卒,因此Set類型必須顯式聲明
可直接用insert和remove插入和刪除元素
可用contains方法檢查Set中是否包含一個特定的值
有多種創(chuàng)建不同集合的方法,可參看swift3.0第94頁
字典簡直類型一致時可以不必寫出字典的類型
字典添加新值可以使用一個恰當類型的鍵作為下標索引诗祸,并且分配恰當類型的新值
也可以使用下標語法來改變特定鍵對應(yīng)的值
可使用updateValue(_:forKey:)更新或者新添值跑芳,該函數(shù)還會返回一個可選值,用于檢查更新是否成功
if let oldValue = airports.updateValue("Dublin Airport",forKey:"DUB"){
print("the old value for DuB was (oldValue)")
}
removeValue(forKey:)方法可用來在字典中移除鍵值對直颅,并且返回被移除的值博个,在沒有值的情況下返回nil
鍵值對對應(yīng)著keys和values
為了以特定的順序遍歷字典的鍵或值,可以對字典的keys或values屬性進行sorted()方法
swift中的switch與C之類的區(qū)別在于际乘,當匹配的case分支中的代碼執(zhí)行完畢后坡倔,程序會終止switch語句,而不會繼續(xù)執(zhí)行下一個case分支脖含,如果想繼續(xù)執(zhí)行的話可以在末尾添加一個fallthrough
不像C語言里的switch語句罪塔,swift里面為了讓單個case同時匹配不同的元素時,需要將這兩個值組合成一個復(fù)合匹配养葵,并且用逗號分開
swift允許多個case匹配同一個值征堪,如果存在多個匹配。那么只會執(zhí)行第一個被匹配的case分支关拒。
case 分支可以使用where語句來判斷額外的條件
let a=(1,-1)
switch b{
case let (x,y) where x==y
print("(\(x),\(y)) is on the line x==y")
case let (x,y)where x==-y
print("(\(x),\(y)) is on the line x==-y")
}
要想改變參數(shù)的值佃蚜,需要在函數(shù)參數(shù)的類型前面加上inout,即使用
輸入輸出參數(shù)着绊,調(diào)用函數(shù)時需要傳入的是變量而不能是常量谐算,函數(shù)參數(shù)中寫的參數(shù)前面應(yīng)加上&
閉包是自包含的函數(shù)代碼塊,可以捕獲的存儲其所在上下文中任意常量和變量的引用
全局函數(shù)是一個有名字但不會捕獲任何值的閉包
嵌套函數(shù)是一個有名字病可以捕獲其封閉函數(shù)域內(nèi)值的閉包
閉包表達式是可以捕獲其上下文中變量或常量名的匿名閉包
閉包中可變參數(shù)應(yīng)放在參數(shù)列表的最后一位
嵌套函數(shù)中捕獲的外部參數(shù)并修改之后在調(diào)用完外圍函數(shù)之后仍然會一直保留
swift3.0第136頁如果你創(chuàng)建了另一個函數(shù)归露,則會有屬于其自己的心得變量
當一個閉包作為參數(shù)傳到一個函數(shù)中洲脂,但是這個閉包在函數(shù)返回時才被執(zhí)行
我們稱該閉包從函數(shù)中逃逸
當使用字符串作為枚舉類型的原始知識,每個枚舉成員的隱式原始值為該枚舉成員的名稱
結(jié)構(gòu)體和枚舉是值類型剧包,值類型被賦予一個變量恐锦,常量活著被傳遞給一個函數(shù)的時候,其值會被拷貝
當把一個結(jié)構(gòu)體的實例賦給另一個時疆液,只是單純的值拷貝一铅,改變另一個的結(jié)構(gòu)體成員時不會對原實例的
成員產(chǎn)生影響。
類時引用類型堕油,引用的是已存在的實例本身而不是其拷貝
判斷兩個常量或者變量是否引用同一個類實例 ===
存儲屬性:
如果創(chuàng)建了一個結(jié)構(gòu)體的實例并將其復(fù)制給一個常量潘飘,則無法修改
當值類型的實例被聲明為常量時肮之,它的所有屬性也是常量
而屬于飲用類型的類則不一樣,把一個引用類型的實例賦給一個常量后卜录,
仍然可以修改該實例的變量屬性
延遲存儲屬性必須聲明為變量局骤,因為屬性的初始值可能在實例構(gòu)造完成之后才會得到
而常量屬性在構(gòu)造完成之前必須要有初始值
計算屬性不直接存儲值,而是用getter和setter來間接獲取和設(shè)置其他屬性或變量的值
調(diào)用類型方法用類名加點
類型屬性是通過類型本身來訪問的暴凑,而不是用實例
如果你使用閉包來初始化屬性,請記住在閉包執(zhí)行時赘来,實例的其它部分都還沒有初始化现喳。這意味著你不能在閉包里訪問其它屬性,即使這些屬性有默認值犬辰。同樣嗦篱,你也不能使用隱式的self屬性,或者調(diào)用任何實例方法幌缝。