Show Menu

Do you have a job opening?

Submit your 30 day Job Listing for FREE

From my short experience with iOS8 Swift there are three approaches to implement the Singleton pattern that support lazy initialisation and thread safety.

Download the Source Files for example

[socialRansom url=”https://github.com/hpique/SwiftSingleton/archive/master.zip” text=”Download the source files here for example”]

These approaches might change or become redundant as the language matures.

Global constant


private let _SingletonSharedInstance = Singleton()

class Singleton  {
    class var sharedInstance : Singleton {
        return _SingletonSharedInstance
    }
}

We use a global constant because class constants are not yet supported.

This approach supports lazy initialization because Swift lazily initializes global constants (and variables), and is thread safe by virtue of let.

Nested struct


class Singleton {
    class var sharedInstance : Singleton {
        struct Static {
            static let instance : Singleton = Singleton()
        }
        return Static.instance
    }
}

Unlike classes, structs do support static constants. By using a nested struct we can leverage its static constant as a class constant.

The nested struct is the approach I recommend until class constants are supported.

dispatch_once

The traditional Objective-C approach ported to Swift. I’m fairly certain there’s no advantage over the nested struct approach but I’m putting it here anyway as I find the differences in syntax interesting.


class Singleton {
    class var sharedInstance : Singleton {
        struct Static {
            static var onceToken : dispatch_once_t = 0
            static var instance : Singleton? = nil
        }
        dispatch_once(&Static.onceToken) {
            Static.instance = Singleton()
        }
        return Static.instance!
    }
}

Download the Source Files for example

[socialRansom url=”https://github.com/hpique/SwiftSingleton/archive/master.zip” text=”Download the source files here for example”]

having issues?

We have a Questions and Answer section where you can ask your iOS Development questions to thousands of iOS Developers.

Ask Question

FREE Download!

Get your FREE Swift 2 Cheat Sheet and quick reference guide PDF download when you sign up to SwiftMonthly


Sharing is caring

If you enjoyed this tutorial, please help us and others by sharing using one of the social media buttons below.


Written by:

I work in the shadows. You can thank me by being a good soul.

Comments

There are currently: 2 Responses to “Quick tip: dispatch_once singleton model in Swift”. Leave your comment!

I’m curious to know whether I’m able to create a singleton this way:
class Singleton {
class var sharedInstance: Singleton {
return Singleton()
}
}
If so, what is the difference between this and using a global constant?


first two demo does not work in Xcode.1 playground


Leave a Reply

Would you like to sign up to the mailing list by our sister site: SwiftMonthly?