将ObjC-Blocks转换为Swift Closures

时间:2014-06-30 16:51:46

标签: ios objective-c closures swift objective-c-blocks

我正在尝试将一些Objective-C Code转换为Swift。我为我的项目添加了Autolayout的Cocoapod“Masonry”并添加了一个Bridging-Header,以便能够在Swift中使用Objective-C方法。

这个ObjC方法:

[_tableView mas_makeConstraints:^(MASConstraintMaker *make) {
    make.edges.equalTo(self.view);
}];

应该类似于以下关闭:

tableView.mas_makeConstraints({ (make : MASConstraintMaker!) -> Void? in
    make.edges.equalTo(self.view)
})

但我得到一个“找不到成员'mas_makeConstraints'”,这不是错误,因为该方法已编入索引并且自动提示给了我以下内容:

tableView.mas_makeConstraints(block: ((MASConstraintMaker!) -> Void)?)

?!

我在这里做错了吗?

2 个答案:

答案 0 :(得分:21)

如果有人遇到这种情况,我只需要2美分:

这个对象

[productView mas_makeConstraints:^(MASConstraintMaker *make) {
    make.left.equalTo(self.view.mas_left).with.offset(15);
    make.right.equalTo(self.view.mas_right).with.offset(15);
    make.top.equalTo(self.view.mas_top).with.offset(15);
    make.height.equalTo(productView.mas_width);
}];

将变成

productView.mas_makeConstraints{ make in
    make.left.equalTo()(self.view.mas_left).with().offset()(15)
    make.right.equalTo()(self.view.mas_right).with().offset()(-15)
    make.top.equalTo()(self.view.mas_top).with().offset()(15)
    make.height.equalTo()(productView.mas_width)
    return ()
}

答案 1 :(得分:6)

此处的方法签名:

(block: ((MASConstraintMaker!) -> Void)?)

...告诉您block 参数是可选的,而不是返回值,应该是Void不是 Void?,您写的是(make: MASConstraintMaker!) -> Void?

:因为Swift Type Inference你不需要把类型放在块中

:因为Swift Trailing Closures你不需要设置一个闭包,它是parens中参数列表中方法的最后一个参数(因为它在这里&#39 ; s是唯一的论点,你可以完全抛弃这些问题。

所以你的整个方法调用block参数可以重写为:

tableView.mas_makeConstraints { make in
    make.edges.equalTo(self.view)
}

终于:它看起来像你在make.edges上调用的实例方法返回一个块,并且由于'隐式返回单一的Swift便利功能表达式块' 它可能是你的块在期望Void时隐式返回该表达式的值的情况 - 所以最后,如果上面没有&#39 ; t work你可能仍然需要通过编写方法调用显式返回Void

tableView.mas_makeConstraints { make in
    make.edges.equalTo(self.view)
    return ()
}