Swift中计算的常量

时间:2016-01-08 20:08:11

标签: ios swift

在Swift> = 2.1中,是每次调用函数时重新计算的函数内的计算常量吗?例如,如果我做了类似的事情:

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

在一个函数中,每次调用函数时都会重新计算nonDecimalSet吗?我可以在类中定义常量,但为了便于阅读,将它放在函数中会很好。

3 个答案:

答案 0 :(得分:4)

是的,它每次都会重新创建。你可能会喜欢这个解决方案:

func check() -> Bool {

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

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

}

在这种情况下,nonDecimalSet仅在第一次以线程安全的方式调用check时创建(使用引擎盖下的dispatch_once)。

答案 1 :(得分: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中设置并初始化它方法

答案 2 :(得分:1)

有很多方法可以做到这一点,但我最后在一个单独的文件中这样做了:

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

extension NSCharacterSet {

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