快速关闭存储并作为变量访问
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 文件获取? [关闭]
有没有办法访问/取消引用并查找存储在双指针向量中的元素的值? [关闭]