gpt4 book ai didi

swift - "compute"值有成语吗?

转载 作者:搜寻专家 更新时间:2023-11-01 06:40:36 24 4
gpt4 key购买 nike

请原谅我的标题不好。如果有更好的想法会更新它。

测试于:Xcode 版本 7.2.1 (7C1002)

我想利用 Swift 的惰性存储属性在“后台”队列中计算属性的值,然后再从主队列访问它。

这是一个定义惰性存储属性的类

class Cache {

lazy var heavilyComputational = {
return 42
}()
}

这是一个示例用法

dispatch_async(dispatch_queue_create("com.qnoid.compute", DISPATCH_QUEUE_CONCURRENT)){

let cache = Cache()

let _ = cache.heavilyComputational

dispatch_async(dispatch_get_main_queue()){
debugPrint(cache.heavilyComputational)
}
}

行得通。

撇开警告不谈,IMO 的意图并不明确。

惰性属性是惰性计算的,但是在这种情况下,“where”、“when”和“why”同样重要但不那么明确。

试图通过“聪明”地使用像这样的结构来阐明意图

struct Compute {

var function: () -> Void {
didSet{
function()
}
}
}

dispatch_async(dispatch_queue_create("com.qnoid.compute", DISPATCH_QUEUE_CONCURRENT)){

let cache = Cache()

Compute {
cache.heavilyComputational
}

dispatch_async(dispatch_get_main_queue()){
debugPrint(cache.heavilyComputational)
}
}

但是由于未使用 Compute 实例,编译器通过删除指令 (AFAICT) 来“智取”我。 FWIW,这是在调试配置上,我只能假设在发布时它会更加激进。

为了比较,这按预期工作(*不是 didSet 调用)

dispatch_async(dispatch_queue_create("com.qnoid.compute", DISPATCH_QUEUE_CONCURRENT)){

let cache = Cache()

let compute = Compute {
cache.heavilyComputational
}

compute.function()

dispatch_async(dispatch_get_main_queue()){
debugPrint(cache.heavilyComputational)
}
}

但到那时,整个目的都落空了。

1。我是不是误会了什么?
2. 在 Swift 中是否有允许这样的原生结构?
3。如果没有,是否有办法重写此代码以使意图明确?
4. 为什么没有调用didSet

示例项目: https://github.com/qnoid/compute

最佳答案

看来你有点意识到这个问题了。据我所知,如果 didSet 在 init 方法中,则不会被触发。

在你的情况下,当你这样做的时候

Compute {
cache.heavilyComputational
}

它实际上是使用结构体的init方法来设置function属性,不会触发didSet

在您的第二次尝试中,由于您显式调用了 function(),它随后将调用 cache.heavilyComputational,因此您触发了 heavilyComputational 的惰性初始化 手动。它几乎等同于您的原始方法(没有 Compute 结构)。


要使您的结构在不调用函数的情况下工作,您必须进行一些修改。

struct Compute {
var function: () -> Void = {} {
didSet{
function()
}
}

init(function: () -> Void) {
setFunction(function)
}

private mutating func setFunction(function: () -> Void) {
self.function = function
}
}

那么你就可以做

Compute {
cache.heavilyComputational
}

为了进一步改进,我将不得不考虑一下。

关于swift - "compute"值有成语吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35904700/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com