如何在 Swift 中使用 Void return 类型的闭包抑制隐式 return

How to Supress implicit return from a closure with Void return type in Swift

让我们考虑一下我们有一个像这样的闭包:(用作 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 行 returns 并忽略剩余的行,因为 NSDictionarysetValue 的返回类型是 Void。我的问题是,有没有办法抑制这种行为?

我用您的代码重新创建了您的示例(稍作调整),没有遇到您描述的问题。不过,我使用了 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 可能是它的原因,也许其他原因导致它 return?

您遇到这个问题是因为您正在创建一个 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)")
    }
})