gpt4 book ai didi

swift - 在捕获可选值之前我是否必须解开它?

转载 作者:行者123 更新时间:2023-11-30 11:45:01 25 4
gpt4 key购买 nike

假设我有这门课:

class ExpirableClosure {

let closure: () -> Void
let isExpired: () -> Bool

func execute() {

guard !isExpired() else { return }
closure()
}

init(_ closure: @escaping () -> Void, _ isExpired: @escaping () -> Bool) {

self.closure = closure; self.isExpired = isExpired
}
}

然后用这个方法保存闭包:

var savedClosures = [ExpirableClosure]()
func saveClosure(_ closure: @escaping () -> Void, expireWith object: AnyObject? = nil) {

let isExpired = (object != nil) ? { [weak object] in object == nil } : { false }
savedClosures.append(ExpirableClosure(closure, isExpired))
}

在解包之前捕获可选值是否会导致 ExpirableClosure 立即过期,因为当函数终止时,对可选值的唯一强引用被销毁?

更新

如果运行此代码:

class Object {}
var handle: Object? = Object()
saveClosure({}, expireWith: handle)
print(savedClosures.first!.isExpired()) // prints false
handle = nil
print(savedClosures.first!.isExpired()) // prints true

关于 this online compiler你会得到那些打印报表。那么 swift 是否在幕后解开了可选值并弱引用了它的值? 否则为什么 isExpired 会返回 false,或者在将 handle 设置为 nil 后返回 true?

最佳答案

你的“handle”变量拥有对该对象的唯一强引用,直到它被设置为nil。此时,{ [weak object] in object == nil } 中的可选“object”变量变为 nil,因为它是弱引用,并且条件返回 true。

如果您没有对过期对象的其他强引用,那么该条目将立即过期:

// for example
saveClosure({}, expireWith: Object())
print(savedClosures.first!.isExpired()) // would print true

关于swift - 在捕获可选值之前我是否必须解开它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48944536/

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