如何将完成块传递给 Swift 中的另一个类

Ull*_*i H 2 block swift

在 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 中做到这一点?

Ewa*_*lor 8

这是您在 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 文档的“函数类型”“闭包”部分。