将ObjC-Blocks转换为Swift Closures

use*_*103 10 closures objective-c ios objective-c-blocks swift

我试图将一些Objective-C Code翻译成Swift.我将Autolayout的Cocoapod"Masonry"添加到我的项目中,并添加了一个Bridging-Header,以便能够在Swift中使用Objective-C方法.

这个ObjC方法:

[_tableView mas_makeConstraints:^(MASConstraintMaker *make) {
    make.edges.equalTo(self.view);
}];
Run Code Online (Sandbox Code Playgroud)

应该像以下关闭:

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

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

tableView.mas_makeConstraints(block: ((MASConstraintMaker!) -> Void)?)
Run Code Online (Sandbox Code Playgroud)

?!

我在这里做错了吗?

L N*_*L N 21

如果有人遇到这种情况,我只需要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);
}];
Run Code Online (Sandbox Code Playgroud)

会变成

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 ()
}
Run Code Online (Sandbox Code Playgroud)


fqd*_*qdn 6

这篇文章在方法签名中:

(block: ((MASConstraintMaker!) -> Void)?)
Run Code Online (Sandbox Code Playgroud)

...告诉你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)
}
Run Code Online (Sandbox Code Playgroud)

最后:看起来你正在调用的实例方法make.edges返回一个块,并且由于"单个表达式块的隐式返回"的Swift便利特性,可能是你的块在它隐含地返回该表达式的值时的情况.期待Void- 所以最后,如果上述方法不起作用,您可能仍需要Void通过编写方法调用显式返回:

tableView.mas_makeConstraints { make in
    make.edges.equalTo(self.view)
    return ()
}
Run Code Online (Sandbox Code Playgroud)

  • 尝试make.edges.equalTo()(self.view) (5认同)