使用同步 DispatchQueue 设置非零值的最 "Swift-like"/clean 方法是什么?

What's the most "Swift-like"/clean way to set a non-nil value with a sync DispatchQueue?

我有一个同步的、并发的 DispatchQueue,我用它来获取一个值,这样它就可以在控制流中立即可用。

let isEmpty: Bool

dispatchQueue.sync {
    isEmpty = self.myProtectedArray.isEmpty
}

print(isEmpty) // error

即使通过 print 语句 isEmpty 总是会被分配一个值(由于是同步的),Swift 编译器不喜欢这样。

我应该如何修改它才能被 Swift 编译器接受而不是一个粗略的解决方案?以 var isEmpty: Bool = true 开头似乎很愚蠢,因为 "initial value" 不清楚。

同步DispatchQueue方法

func sync<T>(execute work: () throws -> T) rethrows -> T

returns 工作项的结果给调用者,这意味着您可以将其作为初始化值分配给布尔常量:

let isEmpty = dispatchQueue.sync {
    return self.myProtectedArray.isEmpty
}

print(isEmpty) // Compiler happy!

正如@Rob所说,不需要self.因为闭包没有转义,在单表达式闭包的情况下可以省略return关键字:

let isEmpty = dispatchQueue.sync {
    myProtectedArray.isEmpty
}