我有以下與 SwiftUI 一起使用的代碼:
import Foundation
public struct Trigger {
public var value = false
public mutating func toggle() {
value = true
let responseDate = Date().advanced(by: 3)
OperationQueue.main.schedule(after: .init(responseDate)) {
moveBack()
}
}
private mutating func moveBack() {
value = false
}
}
但是,我收到一個錯誤:
轉義閉包捕獲變異的“自我”引數

我知道將結構更改為類可以解決這個問題,但是有沒有辦法在結構的轉義閉包中實際捕獲變異的自我?
uj5u.com熱心網友回復:
如您所見,快速解決方案是使用參考型別、類。但為什么會這樣呢?
Swift 結構是值型別,因此它們是不可變的。您可以將函式標記為mutating向編譯器指示函式會改變結構,但這實際上意味著什么?
考慮一個簡單的結構:
struct Counter {
var count
init(_ count: Int = 0)
{
self.count = count
}
mutating func increment() {
self.count =1
}
}
現在,嘗試將 this 的一個實體分配給一個let常量:
let someCounter = Counter()
someCounter.increment()
print(someCounter.count)
你會得到一個錯誤;你需要使用一個var.
var someCounter = Counter()
someCounter.increment()
print(someCounter.count)
當您呼叫mutatingfunc時實際發生的情況是創建了一個newCounter,使用 newcount并將其分配給someCounter. 它實際上是在說someCounter = Counter(someCounter.count 1)
現在,想想如果你可以self在一個逃逸的閉包中變異會發生什么——新Counter的將在未來某個未指定的時間創建,但執行已經繼續。更新太晚了someCounter。
class正如您所發現的,使用 的另一個優點是您可以使用ObservableObject,這使得更新您的 SwiftUI 視圖變得更加容易。
uj5u.com熱心網友回復:
我完成的解決方案:
import Foundation
import Combine
public final class IntervalTrigger: ObservableObject {
private let timeInterval: TimeInterval
@Published var value = false
public init(_ timeInterval: TimeInterval) {
self.timeInterval = timeInterval
}
public func toggle() {
value = true
let responseDate = Date().advanced(by: timeInterval)
OperationQueue.main.schedule(after: .init(responseDate)) { [weak self] in
self?.value = false
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/407485.html
標籤:
上一篇:用貓鼬分類
