这个静态变量会像 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 中如何变化。

所以,有几点观察:

  1. 是的,结构模式中的这个静态将实现所需的行为,只有一个 NSLock 将被实例化。

  2. 语言的重大变化是在 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. 
    }
}