Swift 方法是與某些特定類型相關聯的函數swift
在 Objective-C 中,類是惟一能定義方法的類型。但在 Swift 中,你不只能選擇是否要定義一個類/結構體/枚舉,還能靈活的在你建立的類型(類/結構體/枚舉)上定義方法。函數
在 Swift 語言中,實例方法是屬於某個特定類、結構體或者枚舉類型實例的方法。spa
實例方法提供如下方法:code
能夠訪問和修改實例屬性blog
提供與實例目的相關的功能ip
實例方法要寫在它所屬的類型的先後大括號({})之間。rem
實例方法可以隱式訪問它所屬類型的全部的其餘實例方法和屬性。it
實例方法只能被它所屬的類的某個特定實例調用。io
實例方法不能脫離於現存的實例而被調用。class
語法:
func funcname(Parameters) -> returntype { Statement1 Statement2 …… Statement N return parameters }
import Cocoa class Counter { var count = 0 func increment() { count += 1 } func incrementBy(amount: Int) { count += amount } func reset() { count = 0 } } // 初始計數值是0 let counter = Counter() // 計數值如今是1 counter.increment() // 計數值如今是6 counter.incrementBy(amount: 5) print(counter.count) // 計數值如今是0 counter.reset() print(counter.count)
Counter類定義了三個實例方法:
Counter 這個類還聲明瞭一個可變屬性 count,用它來保持對當前計數器值的追蹤。
Swift 函數參數能夠同時有一個局部名稱(在函數體內部使用)和一個外部名稱(在調用函數時使用
Swift 中的方法和 Objective-C 中的方法極其類似。像在 Objective-C 中同樣,Swift 中方法的名稱一般用一個介詞指向方法的第一個參數,好比:with,for,by等等。
Swift 默認僅給方法的第一個參數名稱一個局部參數名稱;默認同時給第二個和後續的參數名稱爲全局參數名稱。
如下實例中 'no1' 在swift中聲明爲局部參數名稱。'no2' 用於全局的聲明並經過外部程序訪問。
import Cocoa class division { var count: Int = 0 func incrementBy(no1: Int, no2: Int) { count = no1 / no2 print(count) } } let counter = division() counter.incrementBy(no1: 1800, no2: 3) counter.incrementBy(no1: 1600, no2: 5) counter.incrementBy(no1: 11000, no2: 3)
咱們強制在第一個參數添加外部名稱把這個局部名稱看成外部名稱使用(Swift 2.0前是使用 # 號)。
相反,咱們呢也能夠使用下劃線(_)設置第二個及後續的參數不提供一個外部名稱。
import Cocoa class multiplication { var count: Int = 0 func incrementBy(first no1: Int, no2: Int) { count = no1 * no2 print(count) } } let counter = multiplication() counter.incrementBy(first: 800, no2: 3) counter.incrementBy(first: 100, no2: 5) counter.incrementBy(first: 15000, no2: 3)
類型的每個實例都有一個隱含屬性叫作self,self 徹底等同於該實例自己。
import Cocoa class calculations { let a: Int let b: Int let res: Int init(a: Int, b: Int) { self.a = a self.b = b res = a + b print("Self 內: \(res)") } func tot(c: Int) -> Int { return res - c } func result() { print("結果爲: \(tot(c: 20))") print("結果爲: \(tot(c: 50))") } } let pri = calculations(a: 600, b: 300) let sum = calculations(a: 1200, b: 300) pri.result() sum.result()
輸出:
Self 內: 900 Self 內: 1500 結果爲: 880 結果爲: 850 結果爲: 1480 結果爲: 1450
Swift 語言中結構體和枚舉是值類型。通常狀況下,值類型的屬性不能在它的實例方法中被修改。
可是,若是你確實須要在某個具體的方法中修改結構體或者枚舉的屬性,你能夠選擇變異(mutating)這個方法,而後方法就能夠從方法內部改變它的屬性;而且它作的任何改變在方法結束時還會保留在原始結構中。
方法還能夠給它隱含的self屬性賦值一個全新的實例,這個新實例在方法結束後將替換原來的實例。
import Cocoa struct area { var length = 1 var breadth = 1 func area() -> Int { return length * breadth } mutating func scaleBy(res: Int) { length *= res breadth *= res print(length) print(breadth) } } var val = area(length: 3, breadth: 5) val.scaleBy(res: 3) val.scaleBy(res: 30) val.scaleBy(res: 300)
輸出:
9 15 270 450 81000 135000
可變方法可以賦給隱含屬性 self 一個全新的實例。
import Cocoa struct area { var length = 1 var breadth = 1 func area() -> Int { return length * breadth } mutating func scaleBy(res: Int) { self.length *= res self.breadth *= res print(length) print(breadth) } } var val = area(length: 3, breadth: 5) val.scaleBy(res: 13)
實例方法是被類型的某個實例調用的方法,你也能夠定義類型自己調用的方法,這種方法就叫作類型方法。
聲明結構體和枚舉的類型方法,在方法的func關鍵字以前加上關鍵字static。類可能會用關鍵字class來容許子類重寫父類的實現方法。
類型方法和實例方法同樣用點號(.)語法調用。
import Cocoa class Math { class func abs(number: Int) -> Int { if number < 0 { return (-number) } else { return number } } } struct absno { static func abs(number: Int) -> Int { if number < 0 { return (-number) } else { return number } } } let no = Math.abs(number: -35) let num = absno.abs(number: -5) print(no) print(num)
你能夠在一個實例的實例方法中使用這個隱含的self屬性來引用當前實例。