Swift

Swift:Objective-Cの引数があるブロック?

調べるとちゃんと先行事例がありました。ありがたいことです。

次のブロック構文は、はじめて見る用語だったので無視していたのですが、そうもできなくなり調べたら、Objective-Cからswiftに書き直すときの対処まとめ – Qiitaに詳しく載っていました。とても助かります。

とりあえず、次のように整理できるようなので、このルールに従って変換してみます。Appleプログラミングのど素人につき、本当にいつも次々に新しいことが出てきます。

[wAccountMgr addObserver:self block:^(DBAccount *account) {

1. パラメタがない場合

dispatch_async(dispatch_get_global_queue(DISPATCH注1), ^{
[self readFileList:wAccountMgr.linkedAccount];
});

dispatch_async(dispatch_get_global_queue(DISPATCH注1), { () in
self.ExecStackDropboxAds(wAccountMgr.linkedAccount, zFolder:self.mcDropAdspath)
});

注1:(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0)

2. パラメタが1個の場合: index

Ojb.C定義
typedef void (^QSCompletionWithIndexBlock) (NSUInteger index);
– (void)addItem:(NSDictionary *)item
completion:(QSCompletionWithIndexBlock)completion;

呼び出し方
[self.todoService addItem:item completion:^( NSUInteger index ){
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:index inSection:0];
[view insertRowsAtIndexPaths:@[ indexPath ]
withRowAnimation:UITableViewRowAnimationTop];
}];

Swift定義
func addItem(item:NSDictionary, completion:(Int)->Void)

呼び出し方
todoService.addItem(item, completion:{ index in
let indexPath = NSIndexPath(forRow:index, inSection:0)
view.insertRowsAtIndexPaths([indexPath], withRowAnimation:UITableViewRowAnimation.Top)
} )

ここで、ふとCore APIでプロパティ定義をしたらどうかと思い、それを追加してみたのですが、この方法では問題解決ができませんでした。よって、Sync APIを継続します。

ブロック構文 / block構文 / block文

Categories: Swift, 技術