在Swift> = 2.1中,是每次调用函数时重新计算的函数内的计算常量吗?例如,如果我做了类似的事情:
let nonDecimalSet = (NSCharacterSet.decimalDigitCharacterSet()).invertedSet
在一个函数中,每次调用函数时都会重新计算nonDecimalSet吗?我可以在类中定义常量,但为了便于阅读,将它放在函数中会很好。
答案 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
}
}