結構體和類
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
了。(劃重點 這個可以當成面試題。)