在 Objective-C 中,我使用了对现在必须转换为 Swift 的完成块的处理:
在DetailDisplayController.h
typedef void (^AddedCompletitionBlock)(BOOL saved, NSString *primarykey, NSUInteger recordCount);
@interface DetailDisplayController : UITableViewController
@property (nonatomic, copy) AddedCompletitionBlock completionBlock;
@property (strong, nonatomic) Details *detail;
Run Code Online (Sandbox Code Playgroud)
在DetailDisplayController.m
- (void) saveClicked:(id)sender
{
// retrieve PK
NSString *objectId = [[[_detail objectID] URIRepresentation] absoluteString];
if (self.completionBlock != nil)
{
self.completionBlock(_rowChanged, objectId, [_fetchedResultsController.fetchedObjects count]);
}
Run Code Online (Sandbox Code Playgroud)
_rowChanged 和 _fetchedResultsController 是实例变量
在DetailViewController.m调用类中,使用了传递的块
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([segue.identifier isEqualToString:@"DetailDisplay"])
{
DetailDisplayController *detailDisplayController = segue.destinationViewController;
...
detailDisplayController.completionBlock = ^(BOOL saved, NSString *sorter, NSUInteger recordCount)
{
if (saved)
...
Run Code Online (Sandbox Code Playgroud)
我怎样才能在 Swift 中做到这一点?
这是您在 Swift 中需要的等效部分:
typealias AddedCompletionBlock = (saved: Bool, primaryKey: String, recordCount: Int) -> Void
var completionBlock: AddedCompletionBlock? = nil
completionBlock = {saved, primaryKey, recordCount in
print("\(saved), \(primaryKey), \(recordCount)")
}
completionBlock?(saved: true, primaryKey: "key", recordCount: 1)
Run Code Online (Sandbox Code Playgroud)
您可能想仔细阅读Apple Swift 文档的“函数类型”和“闭包”部分。
| 归档时间: |
|
| 查看次数: |
4254 次 |
| 最近记录: |