我想使用Swift 2(即NSLock)在类上定义静态变量。
经过研究,我发现我必须使用结构,如下所示:
class Entity: NSManagedObject {
struct Mechanism {
static let lock = NSLock()
}
func myFunction -> NSArray {
Mechanism.lock.lock()
// do something
Mechanism.lock.unlock()
}
}
这会像C一样工作吗?我的意思是,第一次使用机制时会创建静态锁定常量,后续调用将使用相同的常量吗?
我觉得这不正确,因为行
static let lock = NSLock()
正在初始化NSLock。所以它每次都会初始化一个新的。
如果这不是很快,我会这样做:
static NSLock *lock;
if (!lock) {
lock = ... initialize
}
如何在Swift 2中执行等效操作?
答案 0 :(得分:3)
你说“经过研究,我发现我必须使用一个结构来获得静态的东西。”然后你继续询问它是否真的是一个静态的,它在Swift 2.0中的变化。
所以,有几点意见:
是的,结构模式中的这个静态将实现所需的行为,只会实例化一个NSLock
。
语言的重大变化是在Swift 1.2(不是2.0)中,它现在允许静态变量,完全不需要struct
:
class Entity: NSManagedObject {
static let lock = NSLock()
func myFunction() -> NSArray {
Entity.lock.lock()
// do something
Entity.lock.unlock()
}
}
答案 1 :(得分:1)
说真的,没有人在MacOS X或iOS上使用NSLock。在Objective C中,您使用@synchronized。在Swift中,您使用如下全局函数:
func Synchronized (obj: AnyObject, _ block: dispatch_block_t)
{
objc_sync_enter (obj)
block ()
objc_sync_exit (obj)
}
首先,它使用递归锁。只有这一点才能保护你的头痛。其次,它可以更细粒度地工作,并锁定一个特定的对象。使用:
func myFunction() -> NSArray {
Synchronized(someObject) {
// Stuff to do.
}
}