【问题标题】: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'

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

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

【问题讨论】:

    标签: variables swift callback closures


    【解决方案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' -> 无效'。我很确定我说的不对。有什么想法吗?
      • 我猜你错过了将闭包分配给属性的“=”。
      猜你喜欢
      • 2017-09-07
      • 1970-01-01
      • 2018-08-19
      • 1970-01-01
      • 1970-01-01
      • 2015-08-04
      • 2016-11-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多