Swift物件導向Class的筆記

Share on FacebookShare on Google+Tweet about this on TwitterShare on Tumblr

Swift物件導向Class的筆記:

最簡單的Class撰寫

class Rect {        //宣告類別
    var width: Int = 10
    var height: Int = 10
}

var rect = Rect()   //產生物件
rect.width          //return: 10

注意假如寫過C++的會感覺為什麼物件導向沒有new呢?

在Swift中物件導向並不需要使用 new 而是直接呼叫建構子就行了!

取用方法則是用 . 來叫出裡面的屬性或方法

且裡面每個變數都必須要初始化:

因為有很多種初始化方法,我這邊就舉出C++比較類似的寫法

class Rect {
    var width: Int
    var height: Int

    init(width: Int, height: Int) {
        self.width = width
        self.height = height
    }
}

像是這樣,C++中的this變成了self,且建構式皆為init這點到像是php,就是統一的名稱

解構子則是:

class Rect {
    var width: Int      //must be larger than 0
    var height: Int     //must be larger than 0

    init?(width: Int, height: Int) {
        self.width = width
        self.height = height

        if width <= 0 || height <= 0 {
            return nil
        }
    }
}

C++中建構式是一定沒有回傳值得,但在swift中為了確保成功的建構而弄出了有回傳值,因此可以用init? 假如沒有初始化成功則回傳nil,設計還蠻不錯的!

var rect1 = Rect(width: 10, height: 10) //return: {width 10 height 10}
var rect2 = Rect(width: 10, height: 0) //return: nil

這樣一來就能判斷是否為nil 假如初始化成功再繼續執行你的程式

再來就是private跟public class了

依照C++演繹出來的寫法:

public class Rect {
    //宣告類別
    private var width: Int
    private var height: Int

    init(w:Int,h:Int){

        self.width=10
        self.height=10


    }
    func setWidth(w:Int) ->Void{
        self.width=w
    }
    func setHeight(h:Int) ->Void{
        self.height=h
    }

}

簡單的就是有簡單的get跟set 且注意class前面加上的public 把整個class的屬性都預設成public,自己要的private的屬性可以另外加上去!

使用:

var rect = Rect(w:100,h:200)

rect.setHeight(100)

rect.setWidth(50)

偏向C#版的get set

class Rect {
    var width: Int = 10
    var height: Int = 10
    var x: Int = 0
    var y: Int = 0

    var centerX: Int {
        get {
            return x + width/2
        }
        set {
            x = newValue - width/2
        }
    }

    var centerY: Int {
        get {
            return x + height/2
        }
        set {
            y = newValue - height/2
        }
    }
}

自己還蠻不習慣這個版本的,因為全部都擠在一起,比較偏向C++那種自己打get,set而不是內建的方式。且注意 set{ }的newValue為進來的值

使用:

var rect = Rect()   //return: {width 10 height 10 x 0 y 0}
rect.centerX        //return: 5
rect.centerY        //return: 5
rect.centerX = 10   //return: {width 10 height 10 x 5 y 0}
rect.centerY = 10   //return: {width 10 height 10 x 5 y 5}

…基本上寫Class用到的大概就是這些,其他大概就是一些寫九陰真經才會用到的怪招啊!

像我C++ 寫到現在繼承 跟 多載也只在作業上用而已 , 普通的class通常用不到ww

還有解構子…可以斟酌加上或不加,基本上用到機會也很少:

  deinit {

   }

示範解構子:

class Person {
    var name: String

    init(name: String) {
        self.name = name
        println("(name) is borned")
    }

    deinit {
        println("(name) is dead")
    }
}

var man: Person? = Person(name: "Hemingway")        //output: Hemingway is borned
man = nil                                           //output: Hemingway is dead

注意…當物件沒有參考時會呼叫 解構子!deinit{ } ,可以把這句想成是 delete man @_@

因為swift既然沒有new 就不可能會有delete了