快速关闭存储并作为变量访问

Posted

技术标签:

【中文标题】快速关闭存储并作为变量访问【英文标题】:swift closure stored and access as a variable 【发布时间】:2015-01-05 03:47:39 【问题描述】:

我想在 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'

我更担心最后一条错误消息,因为我不太确定它试图告诉我什么。

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

【问题讨论】:

【参考方案1】:

这是您的工作示例。您有许多错误,附件说明了这些错误。笔记 我让download() 方法返回Bool,以便可以在此屏幕截图中看到结果。

但是,您使用隐式展开的可选项(又名“!”)是不正确的。当值可能是 nil 但将在已知时间分配且不会更改时,使用此类可选值(有关说明,请参阅 Apple 文档)。您的 downloadCompleted 是一个真正的可选(至少在您的示例使用中)。因此,更好的代码是:

【讨论】:

【参考方案2】:

2 个错误。 1st,整个类型应该用()包裹,然后跟一个?要么 !作为可选或隐式展开的可选。第二,你应该用 nil 检查,在 swift 中,没有隐式的布尔转换。

在您的用例中,您应该使用 Optional 而不是 Implicit unwrapped。因为很有可能您的财产价值为零。使用 IUO(Implicit unwrapped optional),你会跳过编译器警告并且会得到一个运行时错误。

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

【讨论】:

谢谢。这就说得通了。但是当我尝试获取回调 BookStore.sharedInstance.downloadCompleted(book: MLBook) -> Void in println("Haha: ") 我收到一个错误:无法使用类型为 '(MLBook) 的参数调用'println' -> 无效'。我很确定我说的不对。有什么想法吗? 我猜你错过了将闭包分配给属性的“=”。

以上是关于快速关闭存储并作为变量访问的主要内容,如果未能解决你的问题,请参考以下文章

如何在 firebase 存储上上传多个文件并将访问 url 和元数据作为 json 或 csv 文件获取? [关闭]

如何删除掉win10中的快速访问

有没有办法访问/取消引用并查找存储在双指针向量中的元素的值? [关闭]

win10电脑应该如何关闭“快速访问”功能?

怎么关闭win10快速访问功能?关闭Windows10系统快速访问方法

C# 是不是有一种存储多个对象并且仍然易于访问的好方法 [关闭]