将ObjC-Blocks翻译为Swift闭包

10

我正在尝试将一些Objective-C代码翻译成Swift。我向我的项目中添加了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个回答

21

如果有人遇到这种情况,这只是我的个人意见:

这是一个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 ()
}

6
这里在方法声明中的这一部分:
(block: ((MASConstraintMaker!) -> Void)?)

这段文字告诉您,block参数是可选的,而不是返回值,返回值应该是Void(不是Void?,在这里你应该写成(make: MASConstraintMaker!) -> Void?

还有:因为Swift类型推断,您不需要在块中放置类型

还有一个:因为Swift尾随闭包,您不需要将作为方法最后一个参数的闭包放在圆括号内的参数列表中(因为此处它是唯一的参数,所以您可以完全省略圆括号)

因此,您整个带有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 ()
}

1
谢谢您的好解释。这应该是有效的,但现在我面临错误:无法将表达式的类型“$T5”转换为类型“() -> ((AnyObject!) -> MASConstraint!)!”。有什么想法吗? - 3vangelos
5
尝试将.make.edges.equalTo()(self.view)翻译为中文:试着让.make.edges.equalTo()(self.view)等于(self.view)的边缘。 - skorulis
我的还是不行,但是... @skorulis 的回答起作用了。虽然不明白为什么...! - dineth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接