ios - 如何在 swift : 中创建带有参数的单例

标签 ios swift singleton parameter-passing

我有以下类(class):

class FeedDataManager: URLManagerdelegate {

let TAG: String = "FeedDataManager"

weak var mDelegate: KeyboardViewController?

var mModelManager: ModelManager!
var mURLManager: UrlManager!
var mGetNewsTimer: NSTimer?

var mFeedsArray: Array<News>!

var mManagedObjectContext: NSManagedObjectContext!
var mPersistentStoreCoordinator: NSPersistentStoreCoordinator!
var mManagedObjectModel: NSManagedObjectModel!

class var sharedInstance: FeedDataManager {
    struct Static {
        static var onceToken: dispatch_once_t = 0
        static var instance: FeedDataManager? = nil
    }

    dispatch_once(&Static.onceToken) {
        Static.instance = FeedDataManager()
    }
    return Static.instance!
}

init (aDelegate: KeyboardViewController) {
    self.mDelegate = aDelegate
}
}

问题:如果您查看 init 方法,您会发现它应该接收一个委托(delegate)指针作为参数,我想将其存储在单例中,所以基本上我需要传递这个参数到这一行:

Static.instance = FeedDataManager()

但我不知道它是怎么做到的,有谁知道如何做到这一点?

顺便说一句:我看到了这个链接: Singleton and init with parameter 但是那里的单例创建是不同的。

最佳答案

我们可以向您展示如何将参数添加到单例声明中,但这并不是一个好主意。单例背后的整个思想是,它在何处实例化并不重要,您可以在任何地方使用它。如果您在代码的两个不同位置使用不同的参数调用此单例,这意味着什么?你有一个竞争条件,行为可能会根据第一次遇到单例的地点和方式而改变。

不相关,但是 dispatch_once 是多余的。 static 变量已用于 dispatch_once。参见 http://developer.apple.com/swift/blog/?id=7 末尾的讨论(这主要针对全局变量,但正如他们附带指出的那样,它也适用于 static 变量)。此外,在 Swift 1.2 中,我们现在可以拥有静态类变量,也不再需要 struct

关于ios - 如何在 swift : 中创建带有参数的单例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29971330/

相关文章:

ios - 将数组传递给 segue

ios - 如何声明大量图片

ios - Swift - 可选属性的 JSON 序列化

ios - 重新加载数据时 Collection View 为零

ios - UIActivityViewController 联系人共享?

ios - 为 qmake TARGET 变量使用带空格的名称

html - 如何在 safari "often visited"中显示自定义网站 Logo

swift - 使用 Swift 单例

php - 常量是否与全局变量和单例一样邪恶?

ios - 使 UIViewController 成为单例?