这个静态var会像C一样工作吗?

时间:2015-07-16 16:26:34

标签: ios macos swift swift2

我想使用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中执行等效操作?

2 个答案:

答案 0 :(得分:3)

你说“经过研究,我发现我必须使用一个结构来获得静态的东西。”然后你继续询问它是否真的是一个静态的,它在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()
        }
    
    }
    

答案 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. 
    }
}