[swift 進階]讀書筆記-第五章:結構體和類 C5P3_結構體(struct)

liaoWorking在掘金發表於2018-12-28

結構體和類

5.3結構體(struct)

知識點: swift會自動會結構體的成員變數新增初始化方法。如下:
struct Point {
    var x:Int
    var y:Int
}

let p = Point(x: 1, y: 1)
///因為是指語義,所以用let定義結構體變數時,無法去改變變數的屬性
p.x = 10 //error
複製程式碼

tips: 如若有一個經常使用的結構體值,可以以靜態屬性定義在擴充套件內,如下

extension Point {
 static let origin = Point(x:0, y:0)
}
Point.origin
複製程式碼

結構體中還能包含其他結構體屬性, 這和類裡面的使用其他類的例項做屬性一樣。

知識點2:我們拿一個結構體當屬性,並重寫didSet方法,當這個結構體屬性的一個屬性被改變時這個結構體的didSet方法就會被觸發。(看起來好繞,直接看下面程式碼吧~)

var xPoint = Point(x: 8, y: 0){
    didSet{
        print("哇哦~我被呼叫了")
    }
}

xPoint.x = 10//哇哦~我被呼叫了
複製程式碼

被呼叫的原因: 結構體的某個深層次的屬性被改變時,等於是改變了結構體,重新為它賦值。so didSet會被呼叫。

知識點3:在swift中 Array是結構體 當改變陣列中某個元素的屬性時 陣列的didSet也會被呼叫。

操作符過載


將兩個結構體相加,可以對+操作符進行過載

static func +(lhs: Point, rhs: Point)-> Point{
    return Point(x: lhs.x + rhs.x, y: lhs.y + rhs.y)
}

let y = Point(x: 10, y: 1) + Point(x: 1, y: 10) ///Point(x: 11, y: 11)
複製程式碼

///這裡的過載為嘛會用static 查資料還沒有查到,知道的同學可以補充上來 thx~

知識點4:struct中如果需要改變self,或者需要改變self中任何屬性。 則需要使用mutating 關鍵字

extension Point {
    mutating func translateY(by offset: Int) {
    ///這裡的y實質上等於是self.y
        y = y + offset
    }
}
複製程式碼

mutating 關鍵字的作用就是標記self是可以改變的 就好像把let 改成了 var

知識點5:swift會自動將屬性的setter標記為mutating

知識點6:很多情況下 一個方法會有可變和不可變的區分 如陣列的 sort() 是可變方法 sorted() 不可變方法會返回一個新的陣列。 swift中還有很多類似的方法。(感覺這裡可以出一個很好的面試題,說說兩個方法的區別。)

瞭解mutating關鍵字


瞭解mutating關鍵字要先了解inout行為。

func triple(x:Int){
    x = x * 3 //error x is let
}
///inout 關鍵字可以將原來的值覆蓋
func triple( x:inout Int) {
    x = x * 3 // ojbk
}
複製程式碼

mutating 關鍵字實質上就是隱式的將self標記成inout了 cool~

所以我們就明白為什麼 過載 += 左邊的引數會被標記成inout了。(劃重點 這個可以當成面試題。)

文章原始檔地址

相關文章