我的目標是將一個 swift-nio Scheduled 實體保存在一個名為 Receiver 的結構中,以供以后使用。它創建 Receiver,將其存盤在陣列中并添加 Scheduled 實體,但陣列中的 Receiver 實體不包含 Scheduled 實體。
可能是什么原因造成的,我該如何解決?
它不會與其他任何事情一起發生,并且與 Scheduled 實體關聯的任務仍會執行。XCode 除錯器甚至在 Receiver 中顯示與變數關聯的實體,但不在陣列中。
private var receivers: Array<Receiver>
func connect() {
var entry = Receiver(
// ...
)
receivers.append(entry)
connect(&entry)
}
func connect(_ device: inout Receiver) {
startTimeout(&device)
// device contains timeout, but receivers[0] does not
}
private func startTimeout(_ entry: inout Receiver) {
stopTimeout(&entry) // Does nothing initially (timeout not yet set)
var device = entry
// The timeout is added once here
entry.timeout = entry.eventLoop.scheduleTask(in: .seconds(10), {
print("Receiver timeout occurred")
self.reconnect(&device)
return 0
})
}
func someStuff() {
// This does not work. timeout is nil, the timeout still occurs
stopTimeout(&entry) // Cancels the Scheduled timeout
}
struct Receiver {
var timeout: Scheduled<Any>?
}
uj5u.com熱心網友回復:
您的結構Receiver
是一種值型別。每次傳遞它都會被復制(創建一個新實體)。操縱它只會改變新的實體。您通過使用inout
引數來避免這種情況。
但是有:
receivers.append(entry)
您正在將一個新實體附加到陣列中。稍后修改entry
不會影響陣列中的實體。
在這種情況下,您應該使用class
.
class Receiver {
var timeout: Scheduled<Any>?
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/507538.html