我嘗試用管理器管理我的功能。問題是功能代碼更新並且在我將該功能添加到我的管理器的那一刻不會保存。我嘗試用這個例子來解釋我的問題:功能數組不會保留其創建的值
class QueueManager {
typealias FunctionType =() ->()
private var functions = [(String, FunctionType)]()
func add(funcName: String, function: FunctionType) -> QueueManager {
functions.append(funcName, function)
return self
}
func runFirst() -> Bool {
guard functions.isEmpty == false else { return false }
functions.first!.1()
functions.removeFirst()
return true
}
}
那麼我這樣做:
let queueManager = QueueManger()
var value = 1
queueManager.add("simpleFunction"){
print(value)
}
value = 2
queueManager.add("simpleFunction"){
print(value)
}
queueManager.runFist()
queueManager.runFist()
,其結果是:
2 // Because value is 2 in both functions. But i added the function while value was 1??
2
但我想要的結果:
1
2
我在做什麼錯?提前致謝!
編輯:很容易操場例如:
import UIKit
var str = "1"
func go() {
print(str)
}
var array:[()->()] = []
array.append(go)
str = "2"
array.append(go)
array[0]()
array[1]()
// Output:
// 2
// 2
編輯2: 我知道2 2是我的代碼正確的輸出。但是我想把它的功能保持在創作狀態。這是否有可能?
編輯3: 非常感謝您的幫助。但我認爲我沒有足夠的解釋我的問題來得到答案。我想在稍後調用一個帶有參數的函數。我不想保留對參數值的引用。我只需要用這些參數值調用函數。
是否可以將該功能保持在創建狀態?我想在稍後用它添加它時的價值來調用它。 –
當然,你需要做的就是確保你的價值傳遞。我用最簡單的方法更新了答案。 – NSAdi
感謝您的回答!但這似乎是一個非常骯髒的解決方案。我用這個管理了100多個功能。如果我將爲每個函數創建新的變量,我將創建超過1000個新值。必須有其他方法來存檔。其他語言也可能。 –