使用同步 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
}
我有一个同步的、并发的 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
}