Swift數(shù)據(jù)類(lèi)型
1.基礎(chǔ)數(shù)據(jù)類(lèi)型:整形Int、浮點(diǎn)數(shù)Double和Float、布爾類(lèi)型Bool,字符串類(lèi)型String。
2.集合數(shù)據(jù)類(lèi)型,Array和Dictionary
3.元組類(lèi)型
4.結(jié)構(gòu)體struct,枚舉enum,類(lèi):class
5.數(shù)值類(lèi)型 和 引用類(lèi)型
(1)數(shù)值類(lèi)型是說(shuō)當(dāng)它被賦值給一個(gè)常量或者變量,或者作為參數(shù)傳遞給函數(shù)時(shí),是完整地復(fù)制了一個(gè)新的數(shù)值,而不是僅僅改變了引用對(duì)象。
(2)所有Swift中的基礎(chǔ)類(lèi)型-整型,浮點(diǎn)型,布爾類(lèi)型,字符串,數(shù)組和字典都是數(shù)值類(lèi)型。它們也都是由結(jié)構(gòu)來(lái)實(shí)現(xiàn)的。
(3)在Swift中所有的結(jié)構(gòu)和枚舉類(lèi)型都是數(shù)值類(lèi)型。這意味這你實(shí)例化的每個(gè)結(jié)構(gòu)和枚舉,其包含的所有屬性,都會(huì)在代碼中傳遞的時(shí)候被完整復(fù)制。
(4)類(lèi) 和 函數(shù) 閉包 是引用類(lèi)型
(5)當(dāng)一個(gè)值類(lèi)型實(shí)例作為常量而存在,它的所有屬性也作為常量而存在。類(lèi)是引用類(lèi)型。如果你將引用類(lèi)型的實(shí)例賦值給常量,依然能夠改變實(shí)例的變量屬性。
?和 !
參見(jiàn)博文:http://joeyio.com/ios/2014/06/04/swift---/
字典和數(shù)組
1.都用[]
2.空數(shù)組 和 空字典
var emptyArray = String (或者 Array<String>() )
let emptyDictionary = Dictionary<String,Int>()
或者
var emptyArr:String[] = []
或者
var emptyArray = Array([]) //用數(shù)組創(chuàng)建數(shù)組
對(duì)于已知類(lèi)型的字典可用[:]置空
var arr = [] //直接這樣寫(xiě)arr是個(gè)空的NSArray
3.確定長(zhǎng)度和默認(rèn)值的數(shù)組
var threeDoubles = Double[](count: 3, repeatedValue: 0.0)
4.用只讀屬性count來(lái)讀取數(shù)組和字典的長(zhǎng)度
5.用屬性isEmpty檢查數(shù)組的長(zhǎng)度是否為0
6.往數(shù)組追加元素
emptyArray.append("one")
emptyArray += "two"
emptyArray += [ "three" , "four" ]
emptyArray.insert("zero" , atIndex:0)
7.從數(shù)組中刪除元素
let lastElement = emptyArray.removeLast() //刪除最后一個(gè)
let indexElement = emptyArray.removeAtIndex(3) //按索引刪除
emptyArray[0...2] = [] //區(qū)間元素替換
- 遍歷數(shù)組
for (index, value) in enumerate(emptyArray) {
println("Item (index): (value)")
} - 給字典增加元素
emptyDictionary["zero"] = 0
if let oldValue = emptyDictionary.updateValue(1, forKey: "one") {
println("The old value for key:one was (oldValue).")
} //增加或更新元素
10.移除字典元素
emptyDictionary["zero"] = nil
let oldValue = emptyDictionary.removeValueForKey("one")
emptyDictionary.removeAll()
11.遍歷字典
for (key, value) in dic {
println("(key): (value)")
}
12.獲取字典的keys和values
let keys = Array(dic.keys)
let values = Array(dic.values)
13.數(shù)組的copy方法
通過(guò)調(diào)用數(shù)組的copy方法來(lái)完成強(qiáng)制拷貝。這個(gè)方法將會(huì)完整復(fù)制一個(gè)數(shù)組到新的數(shù)組中。
14.數(shù)組的unshare方法
如果多個(gè)變量引用了同一個(gè)數(shù)組,可以使用unshare方法來(lái)完成一次“獨(dú)立”區(qū)間
..生成 [ ) 的區(qū)間,而…生成 [ ] 的區(qū)間
元組(Tuple)
元組類(lèi)型可以將一些不同的數(shù)據(jù)類(lèi)型組裝成一個(gè)元素
var yuZu = ( 404 , "error" )
println( yuZu )
var ( one:Int , two:String ) = yuZu
println( one )
println( two )
2.使用 _ 來(lái)忽略不需要的值
var ( one:Int , _ ) = yuZu
println( one )
3.使用元素序號(hào)來(lái)選擇元組中的值,從0開(kāi)始
var tuple = ( 404 , "error" )
println( tuple.0 )
4.使用 元組名.元素名 訪問(wèn)
var tuple = ( eN:404 , eT:"error" )
println( tuple.eN )
函數(shù)
1.帶有變長(zhǎng)參數(shù)的函數(shù)
func matableFunc( names: String... )
{
for name in names {
println(name)
}
}
matableFunc()
matableFunc("x","j","x")
2.輸入-輸出參數(shù) inout
一個(gè)輸入-輸出參數(shù)都有一個(gè)傳遞給函數(shù)的值,由函數(shù)修改后,從函數(shù)返回來(lái)替換原來(lái)的值
func printAndCount(inout stringToPrint: String) -> Int {}
枚舉enum
1.枚舉可以關(guān)聯(lián)方法
2.使用toRaw和fromRaw在原始數(shù)值和枚舉值之間進(jìn)行轉(zhuǎn)換
結(jié)構(gòu)體Struct
1.支持構(gòu)造器和方法
2.結(jié)構(gòu)和類(lèi)的最大區(qū)別在于:結(jié)構(gòu)的實(shí)例按值傳遞(passed by value),而類(lèi)的實(shí)例按引用傳遞(passed by reference)
3.結(jié)構(gòu)類(lèi)型有一種成員逐一完成初始化的構(gòu)造器,類(lèi)不存在成員逐一構(gòu)造器
類(lèi) class
1.重寫(xiě)一個(gè)由繼承而來(lái)的方法需要在方法定義前標(biāo)注override關(guān)鍵詞。
2.@final 用來(lái)標(biāo)記一個(gè)類(lèi)不被繼承或者一個(gè)方法不被重寫(xiě)
3.類(lèi)型方法
在類(lèi)結(jié)構(gòu)體里面用class func開(kāi)頭 ,對(duì)于枚舉和結(jié)構(gòu)來(lái)說(shuō),類(lèi)型方法是用static func開(kāi)頭。
- 便捷初始化.
convenience init() { self.init(name: "[Unnamed]") }
5.weak:弱引用必須聲明為變量 及 可選類(lèi)型
6.unowned:無(wú)主引用不能為可選類(lèi)型
兩階段初始化
在Swift中,類(lèi)的初始化要經(jīng)過(guò)兩個(gè)階段
(1)第一個(gè)階段,每一個(gè)存儲(chǔ)屬性都被設(shè)置了一個(gè)初始值。
(2)在第二個(gè)階段,每個(gè)類(lèi)在這個(gè)實(shí)例被使用之前都會(huì)有機(jī)會(huì)來(lái)設(shè)置它們相應(yīng)的存儲(chǔ)屬性
協(xié)議protocol
1.Swift使用protocol定義協(xié)議
2.Protocol(協(xié)議)用于統(tǒng)一方法和屬性的名稱(chēng),而不實(shí)現(xiàn)任何功能。協(xié)議能夠被類(lèi),枚舉,結(jié)構(gòu)體實(shí)現(xiàn),滿(mǎn)足協(xié)議要求的類(lèi),枚舉,結(jié)構(gòu)體被稱(chēng)為協(xié)議的遵循者
3.屬性要求
通常前置var關(guān)鍵字將屬性聲明為變量。在屬性聲明后寫(xiě)上{ get set }表示屬性為可讀寫(xiě)的。{ get }用來(lái)表示屬性為可讀的。即使你為可讀的屬性實(shí)現(xiàn)了setter方法,它也不會(huì)出錯(cuò)。
protocol SomeProtocol {
var musBeSettable : Int { get set }
var doesNotNeedToBeSettable: Int { get }
}
4.方法要求
協(xié)議能夠要求其遵循者必備某些特定的實(shí)例方法和類(lèi)方法。協(xié)議方法的聲明與普通方法聲明相似,但它不需要方法內(nèi)容.
協(xié)議方法支持變長(zhǎng)參數(shù)(variadic parameter),不支持默認(rèn)參數(shù)(default parameter)。
5.突變方法要求
能在方法或函數(shù)內(nèi)部改變實(shí)例類(lèi)型的方法稱(chēng)為突變方法。在值類(lèi)型(Value Type)(譯者注:特指結(jié)構(gòu)體和枚舉)中的的函數(shù)前綴加上mutating關(guān)鍵字來(lái)表示該函數(shù)允許改變?cè)搶?shí)例和其屬性的類(lèi)型
類(lèi)中的成員為引用類(lèi)型(Reference Type),可以方便的修改實(shí)例及其屬性的值而無(wú)需改變類(lèi)型;而結(jié)構(gòu)體和枚舉中的成員均為值類(lèi)型(Value Type),修改變量的值就相當(dāng)于修改變量的類(lèi)型,而Swift默認(rèn)不允許修改類(lèi)型,因此需要前置mutating關(guān)鍵字用來(lái)表示該函數(shù)中能夠修改類(lèi)型
用class實(shí)現(xiàn)協(xié)議中的mutating方法時(shí),不用寫(xiě)mutating關(guān)鍵字;用結(jié)構(gòu)體,枚舉實(shí)現(xiàn)協(xié)議中的mutating方法時(shí),必須寫(xiě)mutating關(guān)鍵字
6.協(xié)議類(lèi)型
協(xié)議本身不實(shí)現(xiàn)任何功能,但你可以將它當(dāng)做類(lèi)型來(lái)使用
使用場(chǎng)景:
作為函數(shù),方法或構(gòu)造器中的參數(shù)類(lèi)型,返回值類(lèi)型
作為常量,變量,屬性的類(lèi)型
作為數(shù)組,字典或其他容器中的元素類(lèi)型
7.委托(代理)模式
8.在擴(kuò)展中添加協(xié)議成員
9.通過(guò)擴(kuò)展補(bǔ)充協(xié)議聲明:當(dāng)一個(gè)類(lèi)型已經(jīng)實(shí)現(xiàn)了協(xié)議中的所有要求,卻沒(méi)有聲明時(shí),可以通過(guò)擴(kuò)展來(lái)補(bǔ)充協(xié)議聲明
10.集合中的協(xié)議類(lèi)型:協(xié)議類(lèi)型可以被集合使用,表示集合中的元素均為協(xié)議類(lèi)型
11.協(xié)議的繼承:協(xié)議能夠繼承一到多個(gè)其他協(xié)議。語(yǔ)法與類(lèi)的繼承相似,多個(gè)協(xié)議間用逗號(hào),分隔
12.協(xié)議合成:一個(gè)協(xié)議可由多個(gè)協(xié)議采用protocol<oneProtocol,twoProtocol>這樣的格式進(jìn)行組合,稱(chēng)為協(xié)議合成(protocol composition)。
13.檢驗(yàn)協(xié)議的一致性
使用is檢驗(yàn)協(xié)議一致性,使用as將協(xié)議類(lèi)型向下轉(zhuǎn)換(downcast)為的其他協(xié)議類(lèi)型
is操作符用來(lái)檢查實(shí)例是否遵循了某個(gè)協(xié)議。
as?返回一個(gè)可選值,當(dāng)實(shí)例遵循協(xié)議時(shí),返回該協(xié)議類(lèi)型;否則返回nil
as用以強(qiáng)制向下轉(zhuǎn)換型。
@objc用來(lái)表示協(xié)議是可選的,也可以用來(lái)表示暴露給Objective-C的代碼,此外,@objc型 協(xié)議只對(duì)類(lèi)有效,因此只能在類(lèi)中檢查協(xié)議的一致性。
14.可選協(xié)議要求
在協(xié)議中使用@optional關(guān)鍵字作為前綴來(lái)定義可選成員。
可選協(xié)議在調(diào)用時(shí)使用可選鏈
可選協(xié)議只能在含有@objc前綴的協(xié)議中生效。且@objc的協(xié)議只能被類(lèi)遵循。
15.Swift 標(biāo)準(zhǔn)庫(kù)中定義了一個(gè)Equatable協(xié)議,該協(xié)議要求任何遵循的類(lèi)型實(shí)現(xiàn)等式符(==)和不等符(!=)對(duì)任何兩個(gè)該類(lèi)型進(jìn)行比較。所有的 Swift 標(biāo)準(zhǔn)類(lèi)型自動(dòng)支持Equatable協(xié)議
擴(kuò)展extension
1.Swift使用extension聲明擴(kuò)展
2.Swift 中的擴(kuò)展可以:
(1)添加計(jì)算型屬性和計(jì)算靜態(tài)屬性: 擴(kuò)展可以添加新的計(jì)算屬性,但是不可以添加存儲(chǔ)屬性,也不可以向已有屬性添加屬性觀測(cè)器(property observers)。
(2)定義實(shí)例方法和類(lèi)型方法 :擴(kuò)展可以向已有類(lèi)型添加新的實(shí)例方法和類(lèi)型方法.通過(guò)擴(kuò)展添加的實(shí)例方法也可以修改該實(shí)例本身。結(jié)構(gòu)體和枚舉類(lèi)型中修改self或其屬性的方法必須將該實(shí)例方法標(biāo)注為mutating,正如來(lái)自原始實(shí)現(xiàn)的修改方法一樣。
(3)提供新的構(gòu)造器:擴(kuò)展能向類(lèi)中添加新的便利構(gòu)造器,但是它們不能向類(lèi)中添加新的指定構(gòu)造器或析構(gòu)函數(shù)。指定構(gòu)造器和析構(gòu)函數(shù)必須總是由原始的類(lèi)實(shí)現(xiàn)來(lái)提供。
(4)定義下標(biāo):擴(kuò)展可以向一個(gè)已有類(lèi)型添加新下標(biāo)
(5)定義和使用新的嵌套類(lèi)型:擴(kuò)展可以向已有的類(lèi)、結(jié)構(gòu)體和枚舉添加新的嵌套類(lèi)型
(6)使一個(gè)已有類(lèi)型符合某個(gè)協(xié)議 :一個(gè)擴(kuò)展可以擴(kuò)展一個(gè)已有類(lèi)型,使其能夠適配一個(gè)或多個(gè)協(xié)議(protocol)
范型<>
1.Swift使用<>來(lái)聲明泛型函數(shù)或泛型類(lèi)型。
2.Swift支持在類(lèi)、枚舉和結(jié)構(gòu)中使用泛型
3.泛型代碼可以讓你寫(xiě)出根據(jù)自我需求定義、適用于任何類(lèi)型的,靈活且可重用的函數(shù)和類(lèi)型。它的可以讓你避免重復(fù)的代碼,用一種清晰和抽象的方式來(lái)表達(dá)代碼的意圖。
4.泛型函數(shù)
func swapTwoValues (inout a: T, inout b: T) {}
占位類(lèi)型T是一種類(lèi)型參數(shù)的示例。類(lèi)型參數(shù)指定并命名為一個(gè)占位類(lèi)型,并且緊隨在函數(shù)名后面,使用一對(duì)尖括號(hào)括起來(lái).可支持多個(gè)類(lèi)型參數(shù),命名在尖括號(hào)中,用逗號(hào)分開(kāi)。
類(lèi)型別名 typealias
1.Swift 使用typealias關(guān)鍵字定義類(lèi)型別名
- typealias AudioSample = UInt16
斷言assert
1.Swift中用全局函數(shù)assert來(lái)斷言調(diào)試2.assert函數(shù)接受一個(gè)布爾表達(dá)式和一個(gè)斷言失敗時(shí)顯示的消息。如:
let age = -3;
assert(age >= 0, " age cannot < zero")
取余運(yùn)算符 %
1.Swift允許對(duì)浮點(diǎn)數(shù)執(zhí)行取余運(yùn)算
- a % b => a = (b × 最多倍數(shù)) + 余數(shù).
b為負(fù)值時(shí)的b的符號(hào)被忽略,這意味著%b和%-b的結(jié)果是一樣的.
8 % 2.5 = 0.5 ; => (8 = 2.5*3+0.5)
賦值運(yùn)算符 =
Swift中賦值運(yùn)算符并不將自身作為一個(gè)值進(jìn)行返回,所以以下的代碼是不合法的:
if x = y {
// 錯(cuò)誤, 因?yàn)閤 = y并不會(huì)返回一個(gè)值
}
字符串 String
1.特殊字符
空字符\0,反斜杠\,制表符\t,換行符\n,回車(chē)符\r,雙引號(hào)\”和單引號(hào)\’
單字節(jié)Unicode字符,\xnn,其中nn是兩個(gè)十六進(jìn)制數(shù)
雙字節(jié)Unicode字符,\unnnn,其中nnnn是四個(gè)十六進(jìn)制數(shù)
四字節(jié)Unicode字符,\Unnnnnnnn,其中nnnnnnnn是八個(gè)十六進(jìn)制數(shù)
- 字符串不是指針,而是實(shí)際的值
在Swift中,一個(gè)String類(lèi)型就是一個(gè)實(shí)際的值,當(dāng)把String a 賦值給 String b或者把String a 傳遞給函數(shù)參數(shù),實(shí)際相當(dāng)于創(chuàng)建了一個(gè)相等的新值,而不是僅僅像指針那樣指向過(guò)去。
var str5: String = "4"
var str6 = str5
str5 = "5"
println(str5) //輸出5
println(str6) //輸出4 - 用屬性 isEmpty 檢查一個(gè)字符串是否為空
- 用全局函數(shù) countElements 計(jì)算字符串中字符的數(shù)量
5.字符串相等:當(dāng)兩個(gè)字符串包含的字符完全相同時(shí),被判斷為相等 == - hasPrefix 和 hasSuffix
var str = "ssssssss"
if str.hasPrefix("ssss") {
println("str have prefix ssss")
} - uppercaseString 和 lowercaseString
Switch
- 不用寫(xiě)break,不會(huì)自動(dòng)跳轉(zhuǎn)到下一case
2.case語(yǔ)句可以匹配多種類(lèi)型,包括數(shù)據(jù)范圍,元組,或者特定的類(lèi)型等
case 1...3:
case ( _ , 0 ): // _可以匹配任意值
case ( -2...2 , -2...2 ):
case (let x, 0): //數(shù)值綁定
case let (x, y) where x == y: //Where關(guān)鍵詞
for循環(huán)
1.for index in 1...5 {} 中index是一個(gè)常量,不用對(duì)index定義,每次循環(huán)開(kāi)始前index都已被賦值
2.for _ in 1...power {} 用_來(lái)忽略序列中的值
控制跳轉(zhuǎn)語(yǔ)句
1.continue : 停止此次循環(huán),開(kāi)始下一次循環(huán)
2.break : 用來(lái)終止循環(huán)或switch
3.fallthrough : 實(shí)現(xiàn)讓switch中執(zhí)行完一個(gè)case跳轉(zhuǎn)到下一個(gè)case
4.return
標(biāo)簽語(yǔ)句
1.標(biāo)簽語(yǔ)句的一般形式如下:
label name: while condition {
statements
}
閉包
1.閉包表達(dá)式語(yǔ)法
{ (parameters) -> return type in
statements
}
2.閉包和類(lèi)的強(qiáng)引用
當(dāng)將一個(gè)閉包賦值給一個(gè)類(lèi)實(shí)例的屬性,并且閉包體捕獲這個(gè)實(shí)例時(shí),也可能存在一個(gè)強(qiáng)引用循環(huán)。捕獲實(shí)例是因?yàn)殚]包體訪問(wèn)了實(shí)例的屬性,就像self.someProperty,或者調(diào)用了實(shí)例的方法,就像self.someMethod()。不管哪種情況,這都造成閉包捕獲self,造成強(qiáng)引用循環(huán)。
閉包 之 Sort函數(shù)
let names = ["Chris", "Alex", "Ewa", "Barry", "Daniella"]
// Sort函數(shù)
func backwards(s1: String, s2: String) -> Bool { return s1 > s2 }
var reversed = sort(names, backwards)
// 閉包:-表達(dá)式語(yǔ)法
reversed = sort(names, { (s1: String, s2: String) -> Bool in return s1 > s2 } )
// 閉包:-根據(jù)上下文推斷類(lèi)型
reversed = sort(names, { s1, s2 in return s1 > s2 } )
// 閉包:-單行表達(dá)式閉包可以省略 return
reversed = sort(names, { s1, s2 in s1 > s2 } )
// 閉包:參數(shù)名簡(jiǎn)寫(xiě)
reversed = sort(names, { $0 > $1 } )
// 閉包:-運(yùn)算符函數(shù)
reversed = sort(names, >)
//閉包: Trailing 閉包
reversed = sort(names) { $0 > $1 }
閉包 之 map函數(shù)
- Swift 的 Array 類(lèi)型有一個(gè) map 方法,其獲取一個(gè)閉包表達(dá)式作為其唯一參數(shù)。數(shù)組中的每一個(gè)元素調(diào)用一次該閉包函數(shù),并返回該元素所映射的值(也可以是不同類(lèi)型的值)。
- let digitNames = [ 0: "Zero", 1: "One", 2: "Two", 3: "Three", 4: "Four",5: "Five", 6: "Six", 7: "Seven", 8: "Eight", 9: "Nine"]
let numbers = [16, 58, 510]
let strings = numbers.map {
(var number) -> String in
var output = ""
while number > 0 { output = digitNames[number % 10]! + output
number /= 10 }
return output
}
// 字典 digitNames 下標(biāo)后跟著一個(gè)嘆號(hào) (!),因?yàn)樽值湎聵?biāo)返回一個(gè)可選值 (optional value),表明即使該 key不存在也不會(huì)查找失敗。 在上例中,它保證了 number % 10 可以總是作為一個(gè) digitNames 字典的有效下標(biāo) key。 因此嘆號(hào)可以用于強(qiáng)展開(kāi) (force-unwrap) 存儲(chǔ)在可選下標(biāo)項(xiàng)中的 String 類(lèi)型值。
屬性
1.懶惰存儲(chǔ)屬性是當(dāng)它第一次被使用時(shí)才進(jìn)行初值計(jì)算。通過(guò)在屬性聲明前加上@lazy來(lái)標(biāo)識(shí)一個(gè)懶惰存儲(chǔ)屬性。必須聲明懶惰存儲(chǔ)屬性為變量屬性(通過(guò)var),因?yàn)樗某跏贾抵钡綄?shí)例初始化完成之后才被檢索。常量屬性在實(shí)例初始化完成之前就應(yīng)該被賦值,因此常量屬性不能夠被聲明為懶惰存儲(chǔ)屬性。
2.屬性觀察者
willSet: 參數(shù)默認(rèn)命名 newValue
didSet: 參數(shù)默認(rèn)命名 oldValue
屬性初始化時(shí),willset和didSet并不會(huì)被調(diào)用。只有在初始化上下文之外,當(dāng)設(shè)置屬性值時(shí)才被調(diào)用.
- 實(shí)例屬性和類(lèi)型屬性
對(duì)值類(lèi)型而言,定義類(lèi)型屬性使用static關(guān)鍵字,而定義類(lèi)類(lèi)型的類(lèi)型屬性使用class關(guān)鍵字
4.在初始化時(shí)修改靜態(tài)屬性.當(dāng)你在設(shè)置靜態(tài)屬性值時(shí),只要在初始化完成之前,你都可以在初始化時(shí)隨時(shí)修改靜態(tài)屬性。注意:對(duì)于類(lèi)的實(shí)例化,一個(gè)靜態(tài)屬性只能在初始化時(shí)被修改,這個(gè)初始化在類(lèi)定義時(shí)已經(jīng)確定。
關(guān)鍵字
被保留的關(guān)鍵字(keywords)不允許用作標(biāo)識(shí)符,除非被反引號(hào)轉(zhuǎn)義,參見(jiàn) 標(biāo)識(shí)符。
用作聲明的關(guān)鍵字: class、deinit、enum、extension、func、import、init、let、protocol、static、struct、subscript、typealias、var
用作語(yǔ)句的關(guān)鍵字: break、case、continue、default、do、else、fallthrough、if、in、for、return、switch、where、while
用作表達(dá)和類(lèi)型的關(guān)鍵字: as、dynamicType、is、new、super、self、Self、Type、COLUMN、FILE、FUNCTION、LINE
特定上下文中被保留的關(guān)鍵字: associativity、didSet、get、infix、inout、left、mutating、none、nonmutating、operator、override、postfix、precedence、prefix、right、set、unowned、unowned(safe)、unowned(unsafe)、weak、willSet,這些關(guān)鍵字在特定上下文之外可以被用于標(biāo)識(shí)符。
下標(biāo)語(yǔ)法
1.使用subscript關(guān)鍵字定義
2.subscript(index: Int) -> Int {
get { }
set(newValue) {}
}
自動(dòng)引用技術(shù)
對(duì)于生命周期中會(huì)變?yōu)閚il的實(shí)例使用弱引用。相反的,對(duì)于初始化賦值后再也不會(huì)被賦值為nil的實(shí)例,使用無(wú)主引用。
弱引用必須被聲明為變量,表明其值能在運(yùn)行時(shí)被修改。弱引用不能被聲明為常量。
無(wú)主引用是永遠(yuǎn)有值的
Swift 有如下要求:只要在閉包內(nèi)使用self的成員,就要用self.someProperty或者self.someMethod(而不只是someProperty或someMethod)。這提醒你可能會(huì)不小心就捕獲了self。
可選鏈
可選鏈可替代強(qiáng)制解析
類(lèi)型檢查
1.檢查類(lèi)型
用類(lèi)型檢查操作符(is)來(lái)檢查一個(gè)實(shí)例是否屬于特定子類(lèi)型。
if item is SomeClass
2.向下轉(zhuǎn)型
類(lèi)型轉(zhuǎn)型操作符帶有兩種不同形式??蛇x形式( optional form) as? 返回一個(gè)你試圖下轉(zhuǎn)成的類(lèi)型的可選值(optional value)。強(qiáng)制形式 as 把試圖向下轉(zhuǎn)型和強(qiáng)制解包(force-unwraps)結(jié)果作為一個(gè)混合動(dòng)作。
3.Any和AnyObject的類(lèi)型檢查
Swift為不確定類(lèi)型提供了兩種特殊類(lèi)型別名:
AnyObject可以代表任何class類(lèi)型的實(shí)例。
Any可以表示任何類(lèi)型,除了方法類(lèi)型(function types)。