在Swift> = 2.1中,每次調用函數時都會重新計算函數中的計算常量嗎?舉例來說,如果我做這樣的事情:一個函數中Swift中的計算常量
let nonDecimalSet = (NSCharacterSet.decimalDigitCharacterSet()).invertedSet
,是nonDecimalSet重新計算每次函數調用時?我可以在類中定義常量,但在函數中爲了可讀性而設置它是很好的。
在Swift> = 2.1中,每次調用函數時都會重新計算函數中的計算常量嗎?舉例來說,如果我做這樣的事情:一個函數中Swift中的計算常量
let nonDecimalSet = (NSCharacterSet.decimalDigitCharacterSet()).invertedSet
,是nonDecimalSet重新計算每次函數調用時?我可以在類中定義常量,但在函數中爲了可讀性而設置它是很好的。
考慮以下幾點:
func myFunc() -> NSCharacterSet {
let nonDecimalSet = (NSCharacterSet.decimalDigitCharacterSet()).invertedSet
return nonDecimalSet
}
print(myFunc()) // "<__NSCFCharacterSet: 0x7f8379c14cd0>\n"
print(myFunc()) // "<__NSCFCharacterSet: 0x7f8379d0bf10>\n"
注意,函數多次調用時返回兩個不同的對象。在myFunc
範圍結束後,釋放該範圍內剩餘的任何對象。因此,多次調用相同的函數將導致nonDecimalSet
每次都被重新分配。
如果你正在尋找重用整個對象的生命這個組件,考慮做nonDecimalSet
類變量,設置和在類的init
方法對其進行初始化
是的,它的重建每次。你可能會喜歡這樣的解決方案:
func check() -> Bool {
struct Static {
static let nonDecimalSet = (NSCharacterSet.decimalDigitCharacterSet()).invertedSet
}
return Static.nonDecimalSet.longCharacterIsMember(UnicodeScalar("A").value)
}
在這種情況下,nonDecimalSet
只創造了第一次check
被調用,以線程安全的方式(使用dispatch_once
引擎蓋下)。
有很多的這樣做的方法,但我結束了在一個單獨的文件這樣做:
let _nonDecimalSet: NSCharacterSet = (NSCharacterSet.decimalDigitCharacterSet()).invertedSet
extension NSCharacterSet {
static func nonDecimalSet() -> NSCharacterSet {
return _nonDecimalSet
}
}
@Cristik請問你編輯的附加價值? [tag:swift]和[tag:swift2]不是同義詞。 – JAL
從標籤的wiki中:'僅將此標籤用於與版本2.x中的更改直接相關的問題。這篇文章不包含與此相關的問題。編輯信息是由於一個早期的輸入鍵,這就是爲什麼沒有解釋 – Cristik