方法只是一個術語,其實就是將函數與特定的類型結合,類、結構體、枚舉均可以定義方法,方法又分爲實例方法和類型方法,類型方法相似於Objective-C中的類方法。Swift和Objective-C的一大不一樣是,Objective-C只有在類中能夠定義方法。函數
實例方法的語法和函數徹底一致,其和具體類型的實例所關聯,實例方法在調用時由類型的實例點語法進行調用來完成一些功能模塊。示例以下:spa
class Math { //完成加法功能的實例方法 func add(param1:Double,param2:Double)->Double{ return param1+param2 } } //建立類型實例 var obj = Math() //調用方法進行計算 obj.add(5, param2: 5)
與Objective-C相似,Swift中每個類的實例中都隱藏含有一個self屬性,self屬性就是實例自己,開發者能夠在實例方法中使用self來調用屬性或者其餘實例方法,示例以下:code
class Math { //完成加法功能的實例方法 func add(param1:Double,param2:Double)->Double{ return param1+param2 } func mul(param1:Double,param2:Double) -> Double { //使用self調用實例方法 self.add(param1, param2: param2) return param1*param2 } }
然而,Swift並不要求開發者必須寫self,默認狀況下,開發者能夠直接省略self來調用屬性和方法:開發
class Math { //完成加法功能的實例方法 func add(param1:Double,param2:Double)->Double{ return param1+param2 } func mul(param1:Double,param2:Double) -> Double { //使用self調用實例方法 add(param1, param2: param2) return param1*param2 } }
有一種狀況須要注意,對於屬性的調用,若是方法中的參數名和類實例的屬性名相同,則必須使用self來調用類的實例屬性,防止歧義的產生:class
class Math { var param1 = 10.0 //完成加法功能的實例方法 func add(param1:Double,param2:Double)->Double{ //這裏將使用param1=10,若是不加self 將使用參數中的param1 return self.param1+param2 } func mul(param1:Double,param2:Double) -> Double { //使用self調用實例方法 add(param1, param2: param2) return param1*param2 } }
首先須要清楚一個概念,Swift中有兩種類型,值類型和引用類型,具體在類、結構體、枚舉一節中有相關介紹,這裏須要注意的是,對於值類型,即結構體和枚舉,其並不能直接在實例方法中修改實例屬性的值,Swift中提供了另外一種方式,若是真有如此的需求,開發者能夠使用mutating關鍵字將實例方法聲明成可變的,實際上,若是在可變的實例方法中修改了值類型屬性的值,是會建立一個新的實例來代替原來的實例的,示例以下:基礎
struct Point { var x:Double var y:Double mutating func move(x:Double,y:Double) { self.x+=x self.y+=y } } var point = Point(x: 1, y: 1) print(point) point.move(3, y: 3) print(point)
在值類型實例的可變方法中修改屬性的值,實際上就是建立了一個新的實例,上面的寫法和下面的寫法原理是同樣的:原理
struct Point { var x:Double var y:Double mutating func move(x:Double,y:Double) { self = Point(x: self.x+x,y: self.y+y) } }
正如實例方法是經過類型的實例來進行調用的,類型方法是經過類型直接來調用的,相比於實例方法,類型方法中的self指當前類型,一樣開發者能夠使用self來區別類型屬性和類型方法中的參數。使用Static關鍵字來進行類型方法的建立:語法
struct Point { var x:Double var y:Double mutating func move(x:Double,y:Double) { self = Point(x: self.x+x,y: self.y+y) } static func name(){ print("Point") } } Point.name()
若是是在類中建立類型方法,若此方法能夠被子類進行重寫,則應該使用class關鍵字來建立,示例以下:引用
class Math { var param1 = 10.0 //完成加法功能的實例方法 func add(param1:Double,param2:Double)->Double{ //這裏將使用param1=10,若是不加self 將使用參數中的param1 return self.param1+param2 } func mul(param1:Double,param2:Double) -> Double { //使用self調用實例方法 add(param1, param2: param2) return param1*param2 } class func name(){ print("Math") } } Math.name()
專一技術,熱愛生活,交流技術,也作朋友。方法
——琿少 QQ羣:203317592