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 中的方法極為相似。 ,by等等。實例中'no1' 在swift中宣告為局部參數名稱。提供外部名稱設定

我們強制在第一個參數加入外部名稱把這個局部名稱當作外部名稱使用(Swift 2.0前是使用# 號)。 (_)設定第二個及後續的參數不提供一個外部名稱。

##類型的每一個實例都有一個隱含屬性叫做self,self 完全等同於該實例本身。引用目前實例。
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)

在實例方法中修改值類型

Swift 語言中結構體和枚舉是值類型。一般情況下,值類型的屬性不能在它的實例方法中被修改。

但是,如果你確實需要在某個具體的方法中修改結構體或列舉的屬性,你可以選擇變異(mutating)這個方法,然後方法就可以從方法內部改變它的屬性;並且它所做的任何改變在方法結束時也會保留在原始結構中。

方法也可以為它隱含的self屬性賦值一個全新的實例,這個新實例在方法結束後會取代原來的實例。

600
320
3666

以上程式執行輸出結果為:

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 一個全新的實例。

2400
500
45000

以上程式執行輸出結果為:

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()

類型方法

實例方法是被類型的某個實例呼叫的方法,你也可以定義型別本身所呼叫的方法,這種方法就叫做型別方法。

宣告結構體和列舉的型別方法,在方法的func關鍵字之前加上關鍵字static。類別可能會用關鍵字class來允許子類別重寫父類別的實作方法。

類型方法和實例方法一樣用點號(.)語法呼叫。

Self 内: 900
Self 内: 1500
结果为: 880
结果为: 850
结果为: 1480
结果为: 1450

以上程式執行輸出結果為:

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)