持續(xù)更新中...
github:Swift基礎(chǔ)實(shí)例
github:SwiftBasicTableView
type methods
被特定類(lèi)型的實(shí)例 instance
調(diào)用的方法叫實(shí)例方法 instance methods
钳枕,類(lèi)似于 OC
的對(duì)象方法(減號(hào)方法
)。而被類(lèi)型自己調(diào)用的方法叫做類(lèi)型方法 type methods
竹观,類(lèi)似 OC
的類(lèi)方法(加號(hào)方法
)肌幽。你可以在方法關(guān)鍵字 func
前加上關(guān)鍵字 static
來(lái)表示這些方法是 type methods
吸申。在類(lèi)中(Classes
)胖齐,也可以在func
前加 class
關(guān)鍵字表示允許他的子類(lèi)繼承父類(lèi)的這個(gè)方法的實(shí)現(xiàn)肠套。
value type
某一個(gè)類(lèi)型的值根竿,當(dāng)它被分配給某個(gè)變量(variable
)或者常量(constant
)陵像,或者被傳遞給一個(gè)函數(shù)時(shí),它的值是被拷貝的(可以打印它們的內(nèi)存地址進(jìn)行比較)寇壳,那么這種類(lèi)型稱(chēng)為值類(lèi)型value type
醒颖。在 Swift
中,所有的基本類(lèi)型都是都是 value type
壳炎,比如 integers
, floating-point numbers
, Booleans
, strings
, arrays
and dictionaries
泞歉,structures
,enumerations
memberwise initializer
結(jié)構(gòu)體類(lèi)型(structure
)如果它 沒(méi)有 自定義一個(gè)自己的構(gòu)造器的話(huà)匿辩,會(huì)自動(dòng)接收一個(gè)成員構(gòu)造器memberwise initializer
腰耙。和默認(rèn)構(gòu)造器不同,在存儲(chǔ)屬性沒(méi)有被設(shè)置默認(rèn)值的情況下铲球,結(jié)構(gòu)體依然接收一個(gè)memberwise initializer
挺庞。因此,memberwise initializer
是初始化結(jié)構(gòu)體對(duì)象的成員屬性的捷徑:
struct SomeSize {
//var width = 0.0, height = 0.0
var width :Double?
var height:Double?
}
// 不管width和height是否被初始化,SomeSize都會(huì)自動(dòng)接收一個(gè)帶有兩個(gè)參數(shù)width和height的成員構(gòu)造器
SomeSize() //默認(rèn)構(gòu)造器
let someSize = SomeSize(width: 3.0, height: 2.0)
Inout Parameter
一般的稼病,函數(shù)中的變量參數(shù)(variable parameters
)选侨,只能在函數(shù)體里進(jìn)行修改。如果你想把這種修改持久化溯饵,就是在函數(shù)調(diào)用之后侵俗,對(duì)變量參數(shù)的修改,也會(huì)影響到函數(shù)外被傳進(jìn)來(lái)的變量丰刊。你需要把這個(gè)參數(shù)定義為in-out parameter
:在參數(shù)名前面加上關(guān)鍵字 inout
。in-out parameter
的含義就是有一個(gè)值被傳進(jìn)(in
)函數(shù)增拥,被函數(shù)修改之后啄巧,又返回出去(out
)寻歧,并替換原來(lái)的值。一個(gè)變量被當(dāng)做參數(shù)傳進(jìn)函數(shù)時(shí)秩仆,可以在變量名前加上&
码泛,表示這個(gè)變量可以被函數(shù)改變:
func swapTwoInts(inout a:Int, inout _ b:Int) {
let tempInt = a
a = b
b = tempInt
}
var someInt = 3,someIntTwo = 5
swapTwoInts(&someInt, &someIntTwo)
print(someIntTwo) // 3
- 把兩個(gè)值
someInt
和someIntTwo
互換
Failable initializer
當(dāng)初始化一個(gè)類(lèi)(class
),結(jié)構(gòu)體(structure
)或者枚舉(enumeration
)的時(shí)候澄耍,可以允許初始化失敗噪珊,這個(gè)失敗可能是由于某些參數(shù)不合法,或者某些參數(shù)的缺失齐莲,或者其他的一些情況導(dǎo)致的痢站。這個(gè)允許失敗的構(gòu)造器稱(chēng)為可失敗構(gòu)造器 failable initializer
,在關(guān)鍵字 init
后面加上問(wèn)號(hào)?
选酗,來(lái)表示這個(gè)構(gòu)造器 init?
阵难。
比如,給某個(gè)菜添加信息時(shí)芒填,要求呜叫,有三個(gè)屬性:名稱(chēng)name:String
,評(píng)分rating:Int
和圖片photo:UIImage
,其中殿衰,name
rating
不為空且rating > 0
朱庆, photo
可以為空,我們用模型 Meal
來(lái)存儲(chǔ)這些屬性闷祥,Meal
的 failable initializer
如下:
init?(name: String, photo: UIImage?, rating: Int) {
self.name = name
self.photo = photo
self.rating = rating
if name.isEmpty || rating < 0 {
return nil
}
}
- 當(dāng)
name
為空椎工,或者rating < 0
時(shí),就會(huì)初始化失敗蜀踏,此時(shí)可以返回nil
Downcasting
類(lèi)似于類(lèi)型轉(zhuǎn)換维蒙。通常,某個(gè)確定的類(lèi)果覆,其類(lèi)型的常量或變量颅痊,會(huì)引用場(chǎng)景(scene
)背后的一個(gè)子類(lèi)(比如類(lèi)A)的實(shí)例,這樣局待,你可以把這個(gè)常量或變量向下轉(zhuǎn)換(downcast
)為子類(lèi)類(lèi)型A斑响。可以用操作符 as!
or as?
钳榨。as!
是強(qiáng)制類(lèi)型轉(zhuǎn)換舰罚,只有當(dāng)你非常確定這樣做可以成功時(shí),才可以使用薛耻,否則营罢,不成功會(huì)引起 crash
。as?
如果轉(zhuǎn)換不成功,則會(huì)返回 nil
饲漾。所以當(dāng)你不確定向下轉(zhuǎn)換是否能成功時(shí)蝙搔,使用as?
。比如考传,從相冊(cè)選擇一個(gè)圖片時(shí)吃型,可以這樣得到類(lèi)型為 UIImage
的圖片對(duì)象:
let selectedImage = info[UIImagePickerControllerOriginalImage] as! UIImage
Reference Types
Class
和Closure
是 reference types
。和 value types
不同僚楞,reference types
并不是被拷貝的勤晚,而是通過(guò)一個(gè)引用來(lái)訪問(wèn)相同的實(shí)例,無(wú)論是他們被分配給一個(gè)變量或常量或者被傳遞給一個(gè)函數(shù)泉褐。我們假設(shè)類(lèi) VideoMode
有個(gè)屬性 frameRate: Float
赐写,來(lái)查考引用
let tenMode = VideoMode()
tenMode.frameRate = 20.0
let alsoTenMode = tenMode
alsoTenMode.frameRate = 30.0
print("The frameRate now is \(tenMode.frameRate)") // "The frameRate now is 30.0"
實(shí)例 tenMode
被分配給了另外一個(gè)實(shí)例 alsoTenMode
,由于類(lèi)是reference types
兴枯,因此血淌,這兩個(gè)實(shí)例都指向相同的 VideoMode instance
.
Identical to(===) Not identical to(!==)
因?yàn)轭?lèi) class
是引用類(lèi)型,所以多個(gè)常量和變量就可以訪問(wèn) 場(chǎng)景(scene
)后的同一個(gè)實(shí)例(類(lèi)的實(shí)例對(duì)象)财剖。那么悠夯,怎么分辨兩個(gè)實(shí)例或者變量引用的是同一個(gè)實(shí)例(類(lèi)的實(shí)例對(duì)象)呢?可以使用下面兩種操作符來(lái)區(qū)分:
- Identical to (===)
- Not identical to (!==)
我們可以比較上面的類(lèi) VideoMode
的兩個(gè)實(shí)例tenMode
和alsoTenMode
if tenMode === alsoTenMode {
print("tenMode and alsoTenMode refer to the same VideoMode instance.")
// "tenMode and alsoTenMode refer to the same VideoMode instance."
}
Properties
關(guān)于 Strored Properties 躺坟、Lazy Stored Properties沦补、Compute Properties 請(qǐng)參考 Properties 這一章節(jié)