自學swift (2) ---修飾符(後續補充中)

1.private(set)
在var或subscript定義作用域之前,你可以通過private(set)或internal(set)先爲它們的set權限申明一個較低的訪問級別。

private(set) var userName: String?

雖然你可以在其他的源文件中實例化該類並且獲取到userName屬性的值,但是你不能對其進行賦值。就是說,你想用,可以直接拿去用。想知道值是怎麼來的?對不起,你沒權限。

2.required
如果子類需要添加異於父類的初始化方法時,必須先要實現父類中使用required修飾符修飾過的初始化方法。

class FatherClass {
        var string :String
       required init(string :String){
           self.string = string
        }
    }

    class SubClass: FatherClass {
        init (i : Int){
            super.init(string: String(i))
        }
        required init(string: String) {
            fatalError("init(string:) has not been implemented")
        }
    }

這樣父類的方法需要加required 並且子類也要寫required 的這個方法 但是隻是報錯,告訴你,不好意思,父類的這個方法在我們子類不能用了,只能用我們子類的方法。(就好像國家制定個政策,告知美的政府,你可以不執行,當地政府制定一個自己的政策,在本地國家政策市行不通的)

        let sub = SubClass(string: "la")
        print("sub \(sub.string)")

對於上邊的代碼,如果你這樣調用,是不行的。因爲子類不允許父類的初始化方法執行了。
正確的方法應該是
let father = SubClass(i: 3)
print("father\(father.string)")

3.override
這是個重寫方法。和上一條不同的是,父類方法子類調用,ok可以。但是我要重新制定下方法裏做什麼。

    class FatherClass {
        func description() -> String {
            return "fatherClass description"
        }
    }

    class SubClass: FatherClass {
        override func description() -> String {
            return "subClass description"
        }
    }

省廳說一人發10000塊補助,縣裏拿到後重寫了下方法,一人發了100。大概就是這個意思吧。

4.mutating
爲了能在方法中改變屬性的值

struct Point {  
    var x = 0, y = 0 
    mutating func moveXBy(x:Int,yBy y:Int) {  
        self.x += x  
        self.y += y  
    }  
}  
var p = Point(x: 5, y: 5)  
p.moveXBy(3, yBy: 3)  

在值類型的實例方法中,也可以直接修改self屬性值。

5.convenience
convenience只作爲補充和提供使用上的方便。所有的convenience初始化方法都必須調用同一個類中的designated初始化完成設置,另外convenience的初始化方法是不能被子類重寫或從子類中以super的方式被調用的。

6.final
final 修飾符只能修飾類,表明該類不能被其他類集成,也就是它沒資格當父親 final不能修飾結構體和枚舉

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章