我正在尝试将一些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)?)
?!
我在这里做错了吗?
答案 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 ()
}