[解決済み] Swiftでクロージャを変数として格納する
2022-04-28 04:38:49
質問
Objective-Cでは、ブロックの入出力を定義し、メソッドに渡されたブロックの1つを格納し、後でそのブロックを使用することができます。
// in .h
typedef void (^APLCalibrationProgressHandler)(float percentComplete);
typedef void (^APLCalibrationCompletionHandler)(NSInteger measuredPower, NSError *error);
// in .m
@property (strong) APLCalibrationProgressHandler progressHandler;
@property (strong) APLCalibrationCompletionHandler completionHandler;
- (id)initWithRegion:(CLBeaconRegion *)region completionHandler:(APLCalibrationCompletionHandler)handler
{
self = [super init];
if(self)
{
...
_completionHandler = [handler copy];
..
}
return self;
}
- (void)performCalibrationWithProgressHandler:(APLCalibrationProgressHandler)handler
{
...
self.progressHandler = [handler copy];
...
dispatch_async(dispatch_get_main_queue(), ^{
_completionHandler(0, error);
});
...
}
だから、Swiftで同等のことをしようとしているんだ。
var completionHandler:(Float)->Void={}
init() {
locationManager = CLLocationManager()
region = CLBeaconRegion()
timer = NSTimer()
}
convenience init(region: CLBeaconRegion, handler:((Float)->Void)) {
self.init()
locationManager.delegate = self
self.region = region
completionHandler = handler
rangedBeacons = NSMutableArray()
}
completionHandlerの宣言がコンパイラに嫌われた。私はそれを非難するわけではありませんが、どのように私はSwiftで後で設定し、使用することができるクロージャを定義するのでしょうか?
解決方法は?
でコンパイラが文句を言う。
var completionHandler: (Float)->Void = {}
というのは,右辺が適切なシグネチャを持つクロージャ,すなわち を引数にとります。以下のようにすると、"do nothing"クロージャが割り当てられます。 完了ハンドラです。
var completionHandler: (Float)->Void = {
(arg: Float) -> Void in
}
であり、これを短くすると
var completionHandler: (Float)->Void = { arg in }
自動型推論によるものです。
しかし
を初期化することです。
nil
Objective-Cのインスタンス変数の初期化が
nil
. Swift では
で実現することができます。
オプション
:
var completionHandler: ((Float)->Void)?
これで、プロパティが自動的に初期化され
nil
("値なし")です。
Swift では、オプショナルバインディングを使って
補完ハンドラが値を持つ
if let handler = completionHandler {
handler(result)
}
または任意で連鎖する。
completionHandler?(result)
関連
-
[解決済み] テスト
-
[解決済み] ループ内のJavaScriptクロージャ - シンプルな実用例
-
[解決済み] SwiftからObjective-Cのコードを呼び出すにはどうしたらいいですか?
-
[解決済み] Swiftで#pragmaマーク?
-
[解決済み] Swift Betaのパフォーマンス:配列のソート
-
[解決済み] クロージャ」と「ラムダ」の違いは何ですか?
-
[解決済み] Swiftでindexとelementでループを反復させる方法
-
[解決済み] Swiftの@selector()?
-
[解決済み] Swiftではクロージャの内部では常に[unowned self]を使うべきか?
-
[解決済み] PHPでは、クロージャとは何ですか?なぜ "use "識別子を使用するのですか?
最新
-
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 presentViewController
-
[解決済み] Swiftの辞書にキーが含まれているかどうかを判断し、その値を取得する。
-
[解決済み] タイプ 'StorageMetadata' の値には、メンバー 'downloadURL' がありません。
-
[解決済み] String型のenumを列挙する方法は?
-
[解決済み] なぜ「Implicitly Unwrapped Optionals」を作るのか、それは値があることを知っていることを意味しているからです。
-
[解決済み】==と===の違いについて
-
[解決済み】Xcode 6 Beta 4でアプリを実行すると「表示権限がないため、ファイル "MyApp.app" を開くことができません。
-
[解決済み】weak referenceとunowned referenceの違いは何ですか?
-
[解決済み】Swiftの`let`と`var`の違いは何ですか?