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

问题描述 投票:1回答:2

在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;

在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]);
   }

_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)
           ...

我怎么能在Swift中做到这一点?

swift block
2个回答
3
投票

这是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)

您可能想要很好地阅读Apple Swift文档的"Function Types""Closures"部分。


0
投票

在Swift中,完成非常简单。这是一个例子。我按下按钮打开一个SecondVC,然后我按下SecondVC上的一个按钮关闭它,我打电话给完成,这将改变FirstVC上的标签:

    class ViewController: UIViewController {
    @IBOutlet weak var label: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    @IBAction func didTapButton(_ sender: Any) {
        let vc = storyboard?.instantiateViewController(withIdentifier: "SecondVC") as! SecondVC
        self.present(vc, animated: true, completion: nil)
        vc.completion = { str in
            self.label.text = str
        }
    }
 }

这就是SecondVC的样子:

 class SecondVC: UIViewController {
    var completion:((String)->())?

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    @IBAction func didTapButton(_ sender: Any) {
        completion?("Hello")
        self.dismiss(animated: true, completion: nil)
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.