[解決済み] Swift のオプションのエスケープクロージャーパラメータ
質問
与えられた。
typealias Action = () -> ()
var action: Action = { }
func doStuff(stuff: String, completion: @escaping Action) {
print(stuff)
action = completion
completion()
}
func doStuffAgain() {
print("again")
action()
}
doStuff(stuff: "do stuff") {
print("swift 3!")
}
doStuffAgain()
を作る方法はないのでしょうか?
completion
パラメータ(および
action
という型の
Action?
を保持し、さらに
@escaping
?
型を変更すると、次のようなエラーが発生します。
エスケープ属性は、関数型にのみ適用されます。
を削除する
@escaping
属性があるため、コードはコンパイルされて実行されますが、正しいとは言えないようです。
completion
クロージャは関数のスコープをエスケープしています。
どのように解決するのですか?
があります。
SR-2552
という報告
@escaping
が関数型のエイリアスを認識しないため、エラーになります。
@escaping attribute only applies to function types
関数シグネチャで関数型を拡張することで回避することができます。
typealias Action = () -> ()
var action: Action? = { }
func doStuff(stuff: String, completion: (@escaping ()->())?) {
print(stuff)
action = completion
completion?()
}
func doStuffAgain() {
print("again")
action?()
}
doStuff(stuff: "do stuff") {
print("swift 3!")
}
doStuffAgain()
EDIT 1: :
実はxcode 8のベータ版で、このバグは SR-2552 そのバグを修正すると、新しいバグ(あなたが直面しているもの)が発生し、まだ未解決です。 SR-2444 .
回避策
マイケル・イルゼマン
は、一時的な解決策として
@escaping
属性は、オプションの関数型から削除されます。
をエスケープすることで、この関数を維持することができます。
.
func doStuff(stuff: String, completion: Action?) {...}
EDIT 2: :
その
SR-2444
パラメータ位置のクロージャを明示的にクローズしました。
はありません。
でマークする必要があります。
@escaping
はエスケープされますが、オプションのパラメータである
は
は暗黙のうちにエスケープされています。
((Int)->())?
の同義語です。
Optional<(Int)->()>
オプションのクロージャはエスケープされます。
関連
-
[解決済み] Swift言語におけるエクスクラメーションマークの意味とは?
-
[解決済み] 使用しているSwiftのバージョンを確認するにはどうすればよいですか?
-
[解決済み] ループ内のJavaScriptクロージャ - シンプルな実用例
-
[解決済み] SwiftからObjective-Cのコードを呼び出すにはどうしたらいいですか?
-
[解決済み] Swiftで#pragmaマーク?
-
[解決済み] クロージャ」と「ラムダ」の違いは何ですか?
-
[解決済み】JavaScriptの関数にデフォルトのパラメータ値を設定する
-
[解決済み】「このアプリケーションはバックグラウンドのスレッドからオートレイアウトエンジンを変更しています」エラーが発生する?
-
[解決済み】Swiftのオプション値とは何ですか?
-
[解決済み】Swiftの列挙型と関連する値の等質性をテストする方法
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Swift Optionals - 条件の変数バインディングはイニシャライザを必要とする
-
[解決済み] Swiftで文字列が別の文字列を含んでいるかどうかを確認するには?
-
スレッド1:シグナルSIGABRTの問題解決
-
[解決済み] Swiftのコンストラクタ
-
[解決済み] swiftの"? "の意味は何ですか?[重複している]。
-
[解決済み] SwiftでString.Indexはどのように動作するのか
-
[解決済み] Swift Betaのパフォーマンス:配列のソート
-
[解決済み】プログラムによってナビゲーションのタイトルを変更する
-
[解決済み】なぜ、Swiftの文字列では、?のような絵文字が奇妙に扱われるのですか?
-
[解決済み】ReactiveCocoaとRxSwiftの比較 - 長所と短所?