1. ホーム
  2. closures

[解決済み] Swiftの使い方 @autoclosure

2022-06-24 17:32:23

質問

を書くときに気づいたのですが assert をSwiftで書いたとき、最初の値が

@autoclosure() -> Bool

を返すオーバーロードされたメソッドで、一般的な T の値を返します。 LogicValue protocol .

しかし、目の前の問題に厳密にこだわる。それは @autoclosure を返す Bool .

パラメータを取らず、Boolを返す実際のクロージャを書くと、うまくいきません。

assert({() -> Bool in return false}(), "No user has been set", file: __FILE__, line: __LINE__)

しかし、単にBoolを渡すだけではうまくいきません。

assert(false, "No user has been set", file: __FILE__, line: __LINE__)

では、どうなっているのでしょうか?何が @autoclosure ?

編集します。 @auto_closure は改名されました。 @autoclosure

どのように解決するのですか?

引数を1つ取る関数、引数を取らない単純なクロージャを考えてみましょう。

func f(pred: () -> Bool) {
    if pred() {
        print("It's true")
    }
}

この関数を呼び出すには、クロージャを渡す必要があります。

f(pred: {2 > 1})
// "It's true"

中括弧を省略すると、式を渡していることになり、エラーになります。

f(pred: 2 > 1)
// error: '>' produces 'Bool', not the expected contextual result type '() -> Bool'

@autoclosure は式の周りに自動的なクロージャを作ります。したがって、呼び出し側が以下のような式を書くと 2 > 1 のような式を書くと、それは自動的にクロージャに包まれて {2 > 1} に渡される前に f . ですから、もしこれを関数 f :

func f(pred: @autoclosure () -> Bool) {
    if pred() {
        print("It's true")
    }
}

f(pred: 2 > 1)
// It's true

というわけで、クロージャでくくることなく、式だけで動きます。