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 += 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)

上記のプログラムを実行すると、出力は次のようになります。

6
0

Counter クラスは 3 つのインスタンスメソッドを定義しています。

  • incrementカウンタを 1 ずつ増やします。
  • incrementBy(amount: Int)カウンタを指定された整数値ずつ増やします。
  • resetカウンタを 0 にリセットします。

Counterこのクラスは可変プロパティも宣言しています。count、これは現在のカウンタ値を追跡するために使用されます。


メソッドのローカルパラメータ名と外部パラメータ名

Swift の関数パラメータは、ローカル名(関数本体の内部で使用)と外部名(関数を呼び出すときに使用)を同時に持つことができます。

Swift のメソッドは Objective-C のメソッドと非常によく似ています。Objective-C と同様に、Swift のメソッド名は通常、最初のパラメータを指す前置詞(with、for、by など)を使用します。

Swift はデフォルトで、メソッドの最初のパラメータ名にのみローカルパラメータ名を付けます。2 番目以降のパラメータ名にはデフォルトで外部パラメータ名も付けられます。

以下の例では、'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)

上記のプログラムを実行すると、出力は次のようになります。

600
320
3666

外部名を提供するかどうかの設定

最初のパラメータに外部名を強制的に追加して、このローカル名を外部名として使用します(Swift 2.0 より前は # 記号を使用していました)。

逆に、アンダースコア(_)を使用して、2 番目以降のパラメータに外部名を提供しないように設定することもできます。
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(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 に値を代入する

可変メソッドは、暗黙のプロパティ 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)

上記のプログラムを実行すると、出力は次のようになります。

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(number: -35)
let num = absno.abs(number: -5)

print(no)
print(num)

上記のプログラムを実行すると、出力は次のようになります。

35
5
その他の拡張