Swift 関数宣言 - shirajira/family-account-ios GitHub Wiki
Swift 関数宣言
基本
// 引数と戻り値がある場合
func double(x: Int) -> Int {
return x * 2
}
// 引数も戻り値もない場合
func sayHello() {
print("Hello")
}
コールするときには引数ラベルが必要。
let result = double(x: 12) // 24 will be returned.
ラベルの応用
ラベルを省略する
省略しても問題ないラベルの前に _
を付与する。
func swap(_ v1: MyType, _ v2: MyType) {
// ...
}
var data1: MyType = ...
var data2: MyType = ...
// 入れ替える
swap(data1, data2)
実質的にラベルに意味がない場合などに有用。
省略しすぎると可読性を損なう恐れがあるので,用法用量を守って正しくお使いください。
ラベルに別名をつける
ラベルの前に別名を付与する。
以下の例では on
が object
の別名になっている。
func put(_ item: Food, on object: Furniture) {
// ...
}
コールするときは object
ではなく on
を使う。
put(apple, on: table)
コールしたときに英文になるようにデザインすると,可読性がマシマシになる。
Put an apple on the table.
みたいな。動作がイメージしやすいですね。
複数の戻り値
少し変わったところでは,こんな実装もできる。
func getScreenSize() -> (width: CGFloat, height: CGFloat) {
let width = ...
let height = ...
return (width, height)
}
コールするときは適当な変数に受けて,宣言時に命名したラベルでアクセスすればよい。
// スクリーンサイズを求める
let screen = getScreenSize()
// 面積を求める
let area = screen.width * screen.height
可読性に留意して活用すること。
戻り値を省略する
以下のような関数 method
が定義されているとき,
func method() -> Bool {
return doSomething()
}
これを他の場所からコールする場合,戻り値を受け取らない以下のような書き方をすると,
func execute() {
method()
}
Result of call to 'method()' is unused
という警告が出てしまう。
この警告を回避するには以下のように記述する必要があるが,
func execute() {
_ = method()
}
その関数の性質(戻り値に興味がない,など)によっては省略したくなる場合がある。
その場合,関数宣言の先頭に @discardableResult
を付与すればよい。
@discardableResult
func method() -> Bool {
return doSomething()
}
これで警告が出なくなる。
@discardableResult func method() -> Bool {
return doSomething()
}
同じ行に書いてもOK。
参照渡し
inout
をつけると,呼び出し先での実行結果が呼び出し元にも及ぶようになる。
以下は,受け取った text
を繰り返して text
に戻す関数の実装例。
func repeatString(text: inout String) {
text = text + text
}
コールするときは引数の前に &
をつける。
var text: String = "Hoge"
repeatString(text: &text)
print(text)
実行結果。
HogeHoge
入力の "Hoge"
が繰り返されて "HogeHoge"
となっている。
考え方は C のポインタ渡し,C++ の参照渡しに近いかも。