Swift:概念解釋

持續更新中...

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 dictionariesstructuresenumerations

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:在參數名前面加上關鍵字 inoutin-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
  • 把兩個值 someIntsomeIntTwo 互換
Failable initializer

當初始化一個類(class),結構體(structure)或者枚舉(enumeration)的時候,可以允許初始化失敗,這個失敗可能是由于某些參數不合法,或者某些參數的缺失,或者其他的一些情況導致的。這個允許失敗的構造器稱為可失敗構造器 failable initializer,在關鍵字 init 后面加上問號,來表示這個構造器 init?
比如,給某個菜添加信息時,要求,有三個屬性:名稱name:String,評分rating:Int和圖片photo:UIImage,其中,name rating不為空且rating > 0photo可以為空,我們用模型 Meal 來存儲這些屬性,Mealfailable 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! 是強制類型轉換,只有當你非常確定這樣做可以成功時,才可以使用,否則,不成功會引起 crashas? 如果轉換不成功,則會返回 nil。所以當你不確定向下轉換是否能成功時,使用as?。比如,從相冊選擇一個圖片時,可以這樣得到類型為 UIImage 的圖片對象:

let selectedImage = info[UIImagePickerControllerOriginalImage] as! UIImage
Reference Types

ClassClosurereference 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 的兩個實例tenModealsoTenMode

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 這一章節

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容