関数・クロージャ - Swift

最終更新日: 2026-07-26

TOP(About this memo)) > 一覧(Swift) > 関数・クロージャ

クロージャ

関数

func someFunc(bbb: String) -> [String] {
    // 〜〜〜
    return contents
}
func addTwoInts(a: Int, b: Int) -> Int {
    return a + b
}
print(addTwoInts(a: 3, b: 8))

は以下のようにラベル省略可にできる。

func addTwoInts(_ a: Int, _ b: Int) -> Int {
    return a + b
}
print(addTwoInts(3, 8))
func addTwoInts(a: Int, b: Int) -> Int {
    return a + b
}
var mathFunction: (Int, Int) -> Int
mathFunction = addTwoInts
print(mathFunction(3, 8)) // (?) 型宣言した変数経由で呼ぶ場合はラベルが使えなくなる?

参照渡し

クロージャ式(無名関数)

{ (引数) -> 戻り値の型 in
    処理
    return // ステートメントが1行の場合、returnを省略することができる。
}
{ print("foo") }()
let f: (Int, Int) -> String
f = { (num1: Int, num2: Int) -> String in return String(num1 + num2) }

高階関数へクロージャ式を渡す

func calculate(_ a: Int, _ b: Int, _ function: (Int, Int) -> Int) -> Int {
    return function(a, b)
}
calculate(10, 20, {
    (val1: Int, val2: Int) in
    return val1 * val2
})
calculate(10, 20, {
    val1, val2 in
    return val1 * val2
})
calculate(10, 20, { $0 * $1 })
calculate(10, 20, *)
calculate(10, 20, +)
calculate(10, 20, -)

トレーリングクロージャー

calculate(10, 20) {
    $0 * $1
}
func sayHello(greeting: (String) -> String) -> () {
    print(greeting("Hello"))
}
sayHello { $0 + ", World" } // Hello, World
sayHello { "Hi, " + $0 }    // Hi, Hello

複数のクロージャを渡す際の省略記法

subject.sink(
    receiveCompletion: { completion in
        print("complete")
    },
    receiveValue: { string in
        print("\(string)")
    }
)

下記のように書ける。

subject.sink { completion in
    print("complete")
} receiveValue: { string in
    print("\(string)")
}

イニシャライザでも同様

init(action: () -> Void, label: () -> Label)
Button(action: { self.number += 1 }, label: { Text("カウント") })
Button(action: { () -> Void in self.number += 1 }) {
    Text("カウント")
}