持續更新中...
github:Swift基礎實例
github:SwiftBasicTableView
type methods
被特定類型的實例 instance
調用的方法叫實例方法 instance methods
,類似于 OC
的對象方法(減號方法
)。而被類型自己調用的方法叫做類型方法 type methods
,類似 OC
的類方法(加號方法
)。你可以在方法關鍵字 func
前加上關鍵字 static
來表示這些方法是 type methods
。在類中(Classes
),也可以在func
前加 class
關鍵字表示允許他的子類繼承父類的這個方法的實現。
value type
某一個類型的值,當它被分配給某個變量(variable
)或者常量(constant
),或者被傳遞給一個函數時,它的值是被拷貝的(可以打印它們的內存地址進行比較),那么這種類型稱為值類型value type
。在 Swift
中,所有的基本類型都是都是 value type
,比如 integers
, floating-point numbers
, Booleans
, strings
, arrays
and dictionaries
,structures
,enumerations
memberwise initializer
結構體類型(structure
)如果它 沒有 自定義一個自己的構造器的話,會自動接收一個成員構造器memberwise initializer
。和默認構造器不同,在存儲屬性沒有被設置默認值的情況下,結構體依然接收一個memberwise initializer
。因此,memberwise initializer
是初始化結構體對象的成員屬性的捷徑:
struct SomeSize {
//var width = 0.0, height = 0.0
var width :Double?
var height:Double?
}
// 不管width和height是否被初始化,SomeSize都會自動接收一個帶有兩個參數width和height的成員構造器
SomeSize() //默認構造器
let someSize = SomeSize(width: 3.0, height: 2.0)
Inout Parameter
一般的,函數中的變量參數(variable parameters
),只能在函數體里進行修改。如果你想把這種修改持久化,就是在函數調用之后,對變量參數的修改,也會影響到函數外被傳進來的變量。你需要把這個參數定義為in-out parameter
:在參數名前面加上關鍵字 inout
。in-out parameter
的含義就是有一個值被傳進(in
)函數,被函數修改之后,又返回出去(out
),并替換原來的值。一個變量被當做參數傳進函數時,可以在變量名前加上&
,表示這個變量可以被函數改變:
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
- 把兩個值
someInt
和someIntTwo
互換
Failable initializer
當初始化一個類(class
),結構體(structure
)或者枚舉(enumeration
)的時候,可以允許初始化失敗,這個失敗可能是由于某些參數不合法,或者某些參數的缺失,或者其他的一些情況導致的。這個允許失敗的構造器稱為可失敗構造器 failable initializer
,在關鍵字 init
后面加上問號?
,來表示這個構造器 init?
。
比如,給某個菜添加信息時,要求,有三個屬性:名稱name:String
,評分rating:Int
和圖片photo:UIImage
,其中,name
rating
不為空且rating > 0
, photo
可以為空,我們用模型 Meal
來存儲這些屬性,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
}
}
- 當
name
為空,或者rating < 0
時,就會初始化失敗,此時可以返回nil
Downcasting
類似于類型轉換。通常,某個確定的類,其類型的常量或變量,會引用場景(scene
)背后的一個子類(比如類A)的實例,這樣,你可以把這個常量或變量向下轉換(downcast
)為子類類型A。可以用操作符 as!
or as?
。as!
是強制類型轉換,只有當你非常確定這樣做可以成功時,才可以使用,否則,不成功會引起 crash
。as?
如果轉換不成功,則會返回 nil
。所以當你不確定向下轉換是否能成功時,使用as?
。比如,從相冊選擇一個圖片時,可以這樣得到類型為 UIImage
的圖片對象:
let selectedImage = info[UIImagePickerControllerOriginalImage] as! UIImage
Reference Types
Class
和Closure
是 reference types
。和 value types
不同,reference types
并不是被拷貝的,而是通過一個引用來訪問相同的實例,無論是他們被分配給一個變量或常量或者被傳遞給一個函數。我們假設類 VideoMode
有個屬性 frameRate: Float
,來查考引用
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"
實例 tenMode
被分配給了另外一個實例 alsoTenMode
,由于類是reference types
,因此,這兩個實例都指向相同的 VideoMode instance
.
Identical to(===) Not identical to(!==)
因為類 class
是引用類型,所以多個常量和變量就可以訪問 場景(scene
)后的同一個實例(類的實例對象)。那么,怎么分辨兩個實例或者變量引用的是同一個實例(類的實例對象)呢?可以使用下面兩種操作符來區分:
- Identical to (===)
- Not identical to (!==)
我們可以比較上面的類 VideoMode
的兩個實例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
關于 Strored Properties 、Lazy Stored Properties、Compute Properties 請參考 Properties 這一章節