# Swift 方法
Swift 方法是與某些特定類型相關聯的函數
在 Objective-C 中,類是唯一能定義方法的類型。但在 Swift 中,你不僅能選擇是否要定義一個類/結構體/枚舉,還能靈活的在你創建的類型(類/結構體/枚舉)上定義方法。
## 實例方法
在 Swift 語言中,實例方法是屬于某個特定類、結構體或者枚舉類型實例的方法。
實例方法提供以下方法:
* 可以訪問和修改實例屬性
* 提供與實例目的相關的功能
實例方法要寫在它所屬的類型的前后大括號({})之間。
實例方法能夠隱式訪問它所屬類型的所有的其他實例方法和屬性。
實例方法只能被它所屬的類的某個特定實例調用。
實例方法不能脫離于現存的實例而被調用。
### 語法
```
func funcname(Parameters) -> returntype
{
Statement1
Statement2
……
Statement N
return parameters
}
```
### 實例
```
import Cocoa
class Counter {
var count = 0
func increment() {
count++
}
func incrementBy(amount: Int) {
count += amount
}
func reset() {
count = 0
}
}
// 初始計數值是0
let counter = Counter()
// 計數值現在是1
counter.increment()
// 計數值現在是6
counter.incrementBy(5)
print(counter.count)
// 計數值現在是0
counter.reset()
print(counter.count)
```
以上程序執行輸出結果為:
```
6
0
```
Counter類定義了三個實例方法:
* `increment`讓計數器按一遞增;
* `incrementBy(amount: Int)`讓計數器按一個指定的整數值遞增;
* `reset`將計數器重置為0。
`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(1800, no2: 3)
counter.incrementBy(1600, no2: 5)
counter.incrementBy(11000, no2: 3)
```
以上程序執行輸出結果為:
```
600
320
3666
```
### 是否提供外部名稱設置
我們強制在第一個參數添加外部名稱把這個局部名稱當作外部名稱使用(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)
```
以上程序執行輸出結果為:
```
2400
500
45000
```
## self 屬性
類型的每一個實例都有一個隱含屬性叫做self,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(20))")
print("結果為: \(tot(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(3)
val.scaleBy(30)
val.scaleBy(300)
```
以上程序執行輸出結果為:
```
9
15
270
450
81000
135000
```
## 在可變方法中給 self 賦值
可變方法能夠賦給隱含屬性 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(13)
```
以上程序執行輸出結果為:
```
39
65
```
## 類型方法
實例方法是被類型的某個實例調用的方法,你也可以定義類型本身調用的方法,這種方法就叫做類型方法。
聲明結構體和枚舉的類型方法,在方法的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(-35)
let num = absno.abs(-5)
print(no)
print(num)
```
以上程序執行輸出結果為:
```
35
5
```
- Swift 簡介
- Swift 環境搭建
- Swift 基本語法
- Swift 數據類型
- Swift 變量
- Swift 可選(Optionals)類型
- Swift 常量
- Swift 字面量
- Swift 運算符
- Swift 條件語句
- Swift if 語句
- Swift if...else 語句
- Swift if...else if...else 語句
- Swift 嵌套 if 語句
- Swift switch 語句
- Swift 循環
- Swift for-in 循環
- Swift for 循環
- Swift While 循環
- Swift repeat...while 循環
- Swift Continue 語句
- Swift Break 語句
- Swift Fallthrough 語句
- Swift 字符串
- Swift 字符(Character)
- Swift 數組
- Swift 字典
- Swift 函數
- Swift 閉包
- Swift 枚舉
- Swift 結構體
- Swift 類
- Swift 屬性
- Swift 方法
- Swift 下標腳本
- Swift 繼承
- Swift 構造過程
- Swift 析構過程
- Swift 可選鏈
- Swift 自動引用計數(ARC)
- Swift 類型轉換
- Swift 擴展
- Swift 協議
- Swift 泛型
- Swift 訪問控制