Singleton Implementation: Swift

DZone 's Guide to

Singleton Implementation: Swift

Ted Neward explains how to create a Singleton using Swift.

· Mobile Zone ·
Free Resource

Implementation: Swift

Like most languages, Swift makes it pretty straightforward to code up a classic Singleton:

import Foundation

public class Product
  private init() { }

  public static func Instance() -> Product {
    return instance

  public static var TheInstance : Product {
    get { return instance }

  public func DoSomething() {
    print("Doing something for the \(++self.state) time")

  static let instance : Product = Product()
  var state = 0


This is an eagerly-instantiated Singleton, created whenever Swift initializes the static space for theclass; this is described here as being when the class isfirst referenced (a la how Java works). This is probably sufficient for most tasks, particularly given that(as of this writing) Swift apparently has no language-level thread-synchronization constructs.

Note that most Singletons will not have both a static property and method; this is simply here to demonstratewhat each will look like.

(NOTE: As of this writing, Swift 2.2 will generate a warning around the “++self.state” in the above, warning that“++” is deprecated and will be removed in Swift 3).

As noted earlier, Swift lacks any sort of language-level concurrency-protection mechanics, so make sure to build suchsemantics into the implementation of the Swift instance methods.

I am reasonably certain that there’s a way to help deal with subclassed Singletons using the Swift/Objective-C“class” methods, which can be overrideen (!) in subclasses. But I can’t quite figure out when/where/how to make theimplementation work offhand, nor do I really have a use-case around it yet. Not giving up on it yet, though.

ios, mobile, swift

Published at DZone with permission of Ted Neward , DZone MVB. See the original article here.

Opinions expressed by DZone contributors are their own.

{{ parent.title || parent.header.title}}

{{ parent.tldr }}

{{ parent.urlSource.name }}