[英]swift closure stored and access as a variable
我想在swift项目中实现一个回调,就像我以前在Objective-C中做的那样我需要一个类型为closure的变量。 该闭包应该作为参数作为对象并且不返回任何内容。
var downloadCompleted: (MLBook) -> (Void)!
当我需要触发回调时,我这样做:
if self.downloadCompleted {
self.downloadCompleted(book)
}
编译器抱怨此错误消息:
Type '(MLBook) -> (Void)!' does not conform to protocol 'BooleanType'
如果删除if语句,编译器会说:
Property 'self.downloadCompleted' not initialized
即使它被隐含地打开了。
当我尝试获得回调时:
BookStore.sharedInstance.downloadCompleted{(book: MLBook) -> () in
println("Print if you got the callback")
}
我收到此错误消息:
'(MLBook) -> ()' is not convertible to 'MLBook'
我更担心最后一条错误消息,因为我不太确定它要告诉我什么。
任何帮助,将不胜感激。 谢谢
这是你的工作实例。 你有很多错误,附上说明。 注意我有download()
方法返回Bool
以便在此屏幕截图中看到结果。
但是,您使用隐式展开的可选(也称为“!”)是不正确的。 当值可能nil
但将在已知时间分配且未更改时,将使用此可选项(有关说明,请参阅Apple文档)。 您的downloadCompleted
是一个真正的可选项(至少在您的示例中使用)。 因此,更好的代码,结果稍微简单:
2个错误。 1,整个类型应该包裹在()中,然后是一个? 要么 ! 作为可选或隐式展开的可选项。 2,你应该用nil检查,在swift中,没有隐式的布尔转换。
在您的用例中,您应该使用Optional而不是Implicit unwrapped。 因为您的财产很可能具有零值。 使用IUO(隐式解包可选),您跳过编译器警告并将收到运行时错误。
import Foundation
class MLBook {
var name = "name"
}
class A {
var downloadCompleted: ((MLBook) -> Void)?
func down(){
var book = MLBook()
if let cb = self.downloadCompleted {
cb(book)
}
}
}
var a = A()
a.downloadCompleted = {
(book: MLBook) -> Void in
println(book.name)
}
a.down()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.