swift闭包存储和作为变量访问

时间:2014-11-08 11:39:11

标签: variables swift callback closures

我想在swift项目中实现一个回调,就像我以前在Objective-C中所做的那样 我需要一个类型闭包的变量。该闭包应该作为参数作为对象并且不返回任何内容。

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'

我更担心上一条错误消息,因为我不太确定它是告诉我的。

任何帮助将不胜感激。感谢

2 个答案:

答案 0 :(得分:6)

这是你的工作范例。你有很多错误,附上说明。注意 我让download()方法返回Bool,以便在此屏幕截图中看到结果。

enter image description here

但是,你使用一个隐式解包的可选(又名'!')是不正确的。当值可能为nil但将在已知时间分配且未更改时,将使用此类可选项(有关说明,请参阅Apple文档)。您的downloadCompleted是一个真正的可选项(至少在您的示例中使用)。因此,更好的代码,结果稍微简单:

enter image description here

答案 1 :(得分:3)

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()