在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中您需要的等效部分:
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"部分。
在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)
}
}