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その他の拡張