我试图将一些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'",这不是错误,因为该方法已编入索引并且autocomletion给了我以下内容:
tableView.mas_makeConstraints(block: ((MASConstraintMaker!) -> Void)?)
?!
我在这里做错了吗?
如果有人遇到这种情况,我只需要2美分:
这个objc
[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 () }
这篇文章在方法签名中:
(block: ((MASConstraintMaker!) -> Void)?)
...告诉你block
参数是可选的,而不是返回值,应该是Void
(不是 Void?
,你写的地方(make: MASConstraintMaker!) -> Void?
)
另外:因为Swift Type Inference你不需要把类型放在块中
还有:因为Swift Trailing Closures你不需要把一个闭包作为parens中参数列表内部方法的最后一个参数(因为这里它是唯一的参数,你可以完全放弃parens)
所以你用block参数调用的整个方法可以重写为:
tableView.mas_makeConstraints { make in make.edges.equalTo(self.view) }
最后:看起来你正在调用的实例方法make.edges
返回一个块,并且由于"单个表达式块的隐式返回"的Swift便利特性,可能是你的块在它隐含地返回该表达式的值时的情况.期待Void
- 所以最后,如果上述方法不起作用,您可能仍需要Void
通过编写方法调用显式返回:
tableView.mas_makeConstraints { make in make.edges.equalTo(self.view) return () }