【问题标题】:How to Supress implicit return from a closure with Void return type in Swift如何在 Swift 中抑制具有 Void 返回类型的闭包的隐式返回
【发布时间】:2015-05-11 02:35:47
【问题描述】:

假设我们有一个像这样的闭包:(用作completionHandler)

func doSomething (completionHandler : (done : Bool)->Void )->Void {
      ...
     completionHandler(true)
}

现在如果我们想做这样的事情:

doSomething({ (done : Bool)-> Void
  var data : NSDictionary = NSDictionary()
  data.setValue("data1", forKey: "data1")   // 1
  data.setValue("data2", forKey: "data2")   // 2
  data.setValue("data3", forKey: "data3")   // 3
})

它在 // 1 行返回并忽略其余行,因为 NSDictionarysetValue 的返回类型是 Void。我的问题是,有没有办法抑制这种行为?

【问题讨论】:

  • 目前我依赖这个:var ret_consume = data.setValue("data1", forKey: "data1")
  • 试着把这 4 行放在括号 { } 中。
  • @Amit89 这会导致编译时错误 .... 表达式不明确,没有任何上下文

标签: swift return closures implicit completion-block


【解决方案1】:

我用您的代码重新创建了您的示例(稍作调整)并且没有您描述的问题。不过,我使用的是 swift 字典,因为我对 Obj-C 一无所知。

func doSomething(completionHandler: Bool -> Void) {
    completionHandler(true)
}

doSomething() { finished in
    var data = [String: String]()
    data.updateValue("data1", forKey: "data1")  // 1
    data.updateValue("data2", forKey: "data2")  // 2
    data.updateValue("data3", forKey: "data3")  // 3

    for (key, value) in data {
        println("Key: \(key) & Value: \(value)")
    }
}

输出是:

Key: data2 & Value: data2
Key: data1 & Value: data1  // Not sure why data1 is second here
Key: data3 & Value: data3

我怀疑使用 NSDictionary 可能是它的原因,也许是其他原因导致它返回?

【讨论】:

  • 你在这里错过了重点。你在做作业。尝试创建一个返回 Void 的函数,然后通过 doAssign(data, key, value) 之类的函数替换步骤 1、2、3 的分配,然后看看会发生什么......
  • 好吧,我基本上只是使用了你的代码。不知道有什么区别。稍后我会进一步研究。
  • 第一个数据出现在第二个,因为字典无法排序。
  • 我不确定你在说什么。在我的示例中,我重新创建了返回 Void 的函数 doSomething(_:),并将函数作为参数,该函数也返回 Void。然后我用一个函数调用doSomething(_:),建立一个字典并返回Void。与您的代码完全一样,只是我使用了 swift 字典。请在您的问题中解释您到底想要什么,因为如果您提供的代码不是您想要的,那么我们无法为您做很多事情。 @Kutyel:我知道它没有排序,但为什么它总是显示为第二?
  • 我使用的是 NSDictionary 但 NSMutableDictionary 应该在这里使用.....我的错误......感谢大家给予的时间和帮助......
【解决方案2】:

您遇到此问题是因为您正在创建一个不可变的NSDictionary。您需要使用NSMutableDictionary 来执行此操作。

我的代码:

import Foundation

func doSomething (completionHandler: (done: Bool) -> Void ) -> Void {
    completionHandler(done: true)
}

doSomething({ (done: Bool) -> Void in
    var data: NSMutableDictionary = NSMutableDictionary()
    data.setValue("data1", forKey: "data1")   // 1
    data.setValue("data2", forKey: "data2")   // 2
    data.setValue("data3", forKey: "data3")   // 3

    for (key, value) in data {
        println("Key: \(key) & Value: \(value)")
    }
})

【讨论】:

  • 谢谢你救了我,这是我的愚蠢错误......但我很困惑为什么它没有给出运行时错误......
  • @MAbdulSami 这是您问题的答案,但您绝对应该检查是什么阻止您使用 Swift 类型。通过支持下标等,它更好地集成在 Swift 本身中。
  • 我只是有点害怕使用它们,但现在我害怕使用 NS 对象来代替 :D
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-18
  • 1970-01-01
  • 2014-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-02
相关资源
最近更新 更多