闭包中的隐式 return 导致错误
implicit return in a closure causing an error
Error: Cannot convert the expression type (String, MyType) to ()
来自以下代码
Test(method: {[weak self] (message: String) in self?.callback(message)}, instance: self)
如果我添加一个 return 语句,它会起作用,错误就会消失
Test(method: {[weak self] (message: String) in self?.callback(message); return}, instance: self)
不知道如何在没有虚拟 return 语句的情况下处理上述问题,任何建议。
这是我的class测试
public class Test {
private var instance: AnyObject?
private var method: ((message: String) -> ())?
public init(method: (String -> ())?, instance: AnyObject) {
}
}
编辑
我做了一个基于 playground 的简约示例(请复制粘贴进行测试)
class Test {
private var _method: ((String) -> ())?
weak private var _instance: AnyObject?
init(method: (String -> ())?, instance: AnyObject?) {
_method = method
_instance = instance
}
}
class Another {
func register() {
//this doesn't need a return
Test(method: {(message: String) in self.callback(message)}, instance: self)
//this needs a return once I add [weak self]
Test(method: { [weak self] (message: String) in self?.callback(message); return}, instance: self)
}
func callback(message: String) {
println(message)
}
}
Not sure how to handle the above without having to have the dummy return statement, any advise.
你很漂亮的解决了这个问题。匿名函数自动使用单行函数体作为 return 值,因此为防止与预期的 return 类型 (Void) 类型不匹配,您必须添加另一行代码,以便它 不是 单行函数体。伪 return 语句本身 return 是 Void,是处理它的 好方法 ;我只会使用它并继续前进。有一些更时髦的解决方法,但你所拥有的正是我会做的。
编辑:要了解类型不匹配的来源,试试这个:
struct Test {
func voider() -> Void {}
}
let testMaybe = Optional(Test())
let result = testMaybe?.voider()
现在result
不是虚空;它是一个 Optional 包装一个 Void。那就是发生在你身上的事;一个 Void 是预期的,但你的单行匿名函数 returns 是一个 Optional 包装一个 Void。通过添加另一行 returns Void 显式,您解决了问题。
隐式 return 是 return 您的 callback()
方法的结果。 return 值与闭包的 return 值 void
冲突。因此你需要一个明确的,如果丑陋的,return
.
Error: Cannot convert the expression type (String, MyType) to ()
来自以下代码
Test(method: {[weak self] (message: String) in self?.callback(message)}, instance: self)
如果我添加一个 return 语句,它会起作用,错误就会消失
Test(method: {[weak self] (message: String) in self?.callback(message); return}, instance: self)
不知道如何在没有虚拟 return 语句的情况下处理上述问题,任何建议。
这是我的class测试
public class Test {
private var instance: AnyObject?
private var method: ((message: String) -> ())?
public init(method: (String -> ())?, instance: AnyObject) {
}
}
编辑
我做了一个基于 playground 的简约示例(请复制粘贴进行测试)
class Test {
private var _method: ((String) -> ())?
weak private var _instance: AnyObject?
init(method: (String -> ())?, instance: AnyObject?) {
_method = method
_instance = instance
}
}
class Another {
func register() {
//this doesn't need a return
Test(method: {(message: String) in self.callback(message)}, instance: self)
//this needs a return once I add [weak self]
Test(method: { [weak self] (message: String) in self?.callback(message); return}, instance: self)
}
func callback(message: String) {
println(message)
}
}
Not sure how to handle the above without having to have the dummy return statement, any advise.
你很漂亮的解决了这个问题。匿名函数自动使用单行函数体作为 return 值,因此为防止与预期的 return 类型 (Void) 类型不匹配,您必须添加另一行代码,以便它 不是 单行函数体。伪 return 语句本身 return 是 Void,是处理它的 好方法 ;我只会使用它并继续前进。有一些更时髦的解决方法,但你所拥有的正是我会做的。
编辑:要了解类型不匹配的来源,试试这个:
struct Test {
func voider() -> Void {}
}
let testMaybe = Optional(Test())
let result = testMaybe?.voider()
现在result
不是虚空;它是一个 Optional 包装一个 Void。那就是发生在你身上的事;一个 Void 是预期的,但你的单行匿名函数 returns 是一个 Optional 包装一个 Void。通过添加另一行 returns Void 显式,您解决了问题。
隐式 return 是 return 您的 callback()
方法的结果。 return 值与闭包的 return 值 void
冲突。因此你需要一个明确的,如果丑陋的,return
.