这个静态变量会像 C 一样工作吗?
Will this static var work like C?
我想使用 Swift 2 在 class 上定义一个静态变量,它是一个 NSLock。
经过研究我发现我必须使用一个结构,像这样:
class Entity: NSManagedObject {
struct Mechanism {
static let lock = NSLock()
}
func myFunction -> NSArray {
Mechanism.lock.lock()
// do something
Mechanism.lock.unlock()
}
}
这会像 C 一样工作吗?我的意思是,第一次使用 Mechanism 时,将创建一个静态锁常量,后续调用将使用相同的常量?
我觉得这是不正确的,因为行
static let lock = NSLock()
正在初始化 NSLock。所以每次都会初始化一个新的
如果这不是 swift 我会这样做:
static NSLock *lock;
if (!lock) {
lock = ... initialize
}
如何在 Swift 2 中执行等效操作?
你说 "after researching, I discovered that I have to use a struct [to get a static]." 然后你继续问它是否真的是静态的,它在 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()
}
}
说真的,没有人在 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.
}
}
我想使用 Swift 2 在 class 上定义一个静态变量,它是一个 NSLock。
经过研究我发现我必须使用一个结构,像这样:
class Entity: NSManagedObject {
struct Mechanism {
static let lock = NSLock()
}
func myFunction -> NSArray {
Mechanism.lock.lock()
// do something
Mechanism.lock.unlock()
}
}
这会像 C 一样工作吗?我的意思是,第一次使用 Mechanism 时,将创建一个静态锁常量,后续调用将使用相同的常量?
我觉得这是不正确的,因为行
static let lock = NSLock()
正在初始化 NSLock。所以每次都会初始化一个新的
如果这不是 swift 我会这样做:
static NSLock *lock;
if (!lock) {
lock = ... initialize
}
如何在 Swift 2 中执行等效操作?
你说 "after researching, I discovered that I have to use a struct [to get a static]." 然后你继续问它是否真的是静态的,它在 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() } }
说真的,没有人在 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.
}
}