[解決済み] 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
というわけで、クロージャでくくることなく、式だけで動きます。
関連
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン