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)
不知道如何处理上述内容而无需使用虚拟返回语句,任何建议.
这是我的班级测试
public class Test { private var instance: AnyObject? private var method: ((message: String) -> ())? public init(method: (String -> ())?,instance: AnyObject) { } }
编辑
我做了一个基于游乐场的简约示例(请复制粘贴以进行测试)
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.
你已经很好地解决了这个问题.匿名函数自动使用单行函数体作为返回值,因此为了防止导致类型与预期返回类型(Void)不匹配,您必须添加另一行代码,使其不是单行函数身体.虚拟返回语句本身返回Void,是处理它的好方法;我会用它并继续前进.有一些更狡猾的解决方法,但你拥有的正是我会做的.
编辑:要了解类型不匹配的来源,请尝试以下方法:
struct Test { func voider() -> Void {} } let testMaybe = Optional(Test()) let result = testMaybe?.voider()
现在结果不是虚空;它是一个可选的包裹空洞.这就是发生在你身上的事情;预期Void,但你的单行匿名函数返回一个Optional包装一个Void.通过添加另一行显式返回Void,您解决了问题.