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

时间:2015-04-30 15:08:02

标签: ios swift singleton parameter-passing

我有以下课程:

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方法,你会发现它应该作为参数接收我想要存储在单例中的委托指针,所以基本上我需要传递这个参数到这一行:

Static.instance = FeedDataManager()

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

BTW:我看到了这个链接: Singleton and init with parameter 但单身人士的创作却有所不同。

1 个答案:

答案 0 :(得分:10)

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

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