2016-01-08 57 views
2

在Swift> = 2.1中,每次調用函數時都會重新計算函數中的計算常量嗎?舉例來說,如果我做這樣的事情:一個函數中Swift中的計算常量

let nonDecimalSet = (NSCharacterSet.decimalDigitCharacterSet()).invertedSet 

,是nonDecimalSet重新計算每次函數調用時?我可以在類中定義常量,但在函數中爲了可讀性而設置它是很好的。

+0

@Cristik請問你編輯的附加價值? [tag:swift]和[tag:swift2]不是同義詞。 – JAL

+0

從標籤的wiki中:'僅將此標籤用於與版本2.x中的更改直接相關的問題。這篇文章不包含與此相關的問題。編輯信息是由於一個早期的輸入鍵,這就是爲什麼沒有解釋 – Cristik

回答

2

考慮以下幾點:

func myFunc() -> NSCharacterSet { 
    let nonDecimalSet = (NSCharacterSet.decimalDigitCharacterSet()).invertedSet 
    return nonDecimalSet 
} 

print(myFunc()) // "<__NSCFCharacterSet: 0x7f8379c14cd0>\n" 
print(myFunc()) // "<__NSCFCharacterSet: 0x7f8379d0bf10>\n" 

注意,函數多次調用時返回兩個不同的對象。在myFunc範圍結束後,釋放該範圍內剩餘的任何對象。因此,多次調用相同的函數將導致nonDecimalSet每次都被重新分配。

如果你正在尋找重用整個對象的生命這個組件,考慮做nonDecimalSet類變量,設置和在類的init方法對其進行初始化

+0

呃,我想我可以自己做到這一點:謝謝你經歷的麻煩。我可能會創建它作爲一個實例或靜態var;我只是不喜歡這種言辭...... – pickwick

+0

@pickwick不用擔心。如果您有任何問題,請隨時跟進其他問題。 – JAL

4

是的,它的重建每次。你可能會喜歡這樣的解決方案:

func check() -> Bool { 

    struct Static { 
     static let nonDecimalSet = (NSCharacterSet.decimalDigitCharacterSet()).invertedSet 
    } 

    return Static.nonDecimalSet.longCharacterIsMember(UnicodeScalar("A").value) 

} 

在這種情況下,nonDecimalSet只創造了第一次check被調用,以線程安全的方式(使用dispatch_once引擎蓋下)。

1

有很多的這樣做的方法,但我結束了在一個單獨的文件這樣做:

let _nonDecimalSet: NSCharacterSet = (NSCharacterSet.decimalDigitCharacterSet()).invertedSet 

extension NSCharacterSet { 

    static func nonDecimalSet() -> NSCharacterSet { 
     return _nonDecimalSet 
    } 
}