在Swift中結構體和枚舉也可以定義方法,而在 Objective-C 中,類是惟一能定義方法的類型。函數
實例方法spa
實例方法是屬於某個特定類、結構體或者枚舉類型實例的方法,實例方法提供訪問和修改實例屬性的途徑,實例方法的語法與函數徹底一致。實例方法可以隱式訪問它所屬類型的全部的其餘實例方法和屬性。實例方法只能被它所屬的類的某個特定實例調用。實例方法不能脫離於現存的實例而被調用。code
class Counter { var count = 0 func increment() { count++ } func incrementBy(amount: Int) { count += amount } func reset() { count = 0 } }
和調用屬性同樣,用點語法(dot syntax)調用實例方法blog
方法的局部參數名稱和外部參數名稱rem
Swift 默認僅給方法的第一個參數名稱一個局部參數名稱;默認同時給第二個和後續的參數名稱局部參數名稱和外部參數名稱。這個約定與典型的命名和調用約定相適應,與你在寫 Objective-C 的方法時很類似。這個約定還讓表達式方法在調用時不須要再限定參數名稱。it
下面Counter的另外寫法io
class Counter { var count: Int = 0 func incrementBy(amount: Int, numberOfTimes: Int) { count += amount * numberOfTimes } }
incrementBy方法有兩個參數: amount和numberOfTimes。默認狀況下,Swift 只把amount看成一個局部名稱,可是把numberOfTimes即看做局部名稱又看做外部名稱。下面調用這個方法:class
let counter = Counter() counter.incrementBy(5, numberOfTimes: 3) // counter value is now 15
func incrementBy(amount: Int, #numberOfTimes: Int) { count += amount * numberOfTimes }
這種默認行爲使上面代碼意味着:在 Swift 中定義方法使用了與 Objective-C 一樣的語法風格,而且方法將以天然表達式的方式被調用。變量
修改方法的外部參數名稱行爲循環
self屬性
類型的每個實例都有一個稱爲「self」的隱式屬性,它與實例自己至關。你能夠在一個實例的實例方法中使用這個隱含的self屬性來引用當前實例。
上面例子中的increment方法還能夠這樣寫
func increment() { self.count++ }
你沒必要在你的代碼裏面常用self。Swift 假定你是指當前實例的屬性或者方法。這種假定在上面的Counter中已經示範了:Counter中的三個實例方法中都使用的是count(而不是self.count)
struct Point { var x = 0.0, y = 0.0 func isToTheRightOfX(x: Double) -> Bool { return self.x > x } } let somePoint = Point(x: 4.0, y: 5.0) if somePoint.isToTheRightOfX(1.0) { println("This point is to the right of the line where x == 1.0") } // 輸出 "This point is to the right of the line where x == 1.0"(這個點在x等於1.0這條線的右邊)
若是不使用self前綴,Swift 就認爲兩次使用的x都指的是名稱爲x的函數參數
在實例方法中修改值類型
struct Point { var x = 0.0, y = 0.0 mutating func moveByX(deltaX: Double, y deltaY: Double) { x += deltaX y += deltaY } } var somePoint = Point(x: 1.0, y: 1.0) somePoint.moveByX(2.0, y: 3.0) println("The point is now at (\(somePoint.x), \(somePoint.y))") // 輸出 "The point is now at (3.0, 4.0)"
注意:不能在結構體類型常量上調用變異方法,由於常量的屬性不能被改變,即便想改變的是常量的變量屬性也不行,
struct Point { var x = 0.0, y = 0.0 mutating func moveByX(deltaX: Double, y deltaY: Double) { self = Point(x: x + deltaX, y: y + deltaY) } }
枚舉的變異方法能夠把self設置爲相同的枚舉類型中不一樣的成員
enum TriStateSwitch { case Off, Low, High mutating func next() { switch self { case Off: self = Low case Low: self = High case High: self = Off } } } var ovenLight = TriStateSwitch.Low ovenLight.next() // ovenLight 如今等於 .High ovenLight.next() // ovenLight 如今等於 .Off
上面的例子中定義了一個三態開關的枚舉。每次調用next方法時,開關在不一樣的電源狀態(Off,Low,High)以前循環切換。
class SomeClass { class func someTypeMethod() { // type method implementation goes here } } SomeClass.someTypeMethod()