skrite
skrite

Reputation: 327

how to create a singleton in swift with init variables

I am trying to create a singleton class in swift but I am getting an error "cannot create a single-element tuple with an element label"

i am not getting it.

class GroupObject {
// we want the group object to be a singleton


var name: String
var id: Int
var groupJsonObject: JSON

init(groupJsonObject: JSON){
    self.groupJsonObject = groupJsonObject
    self.id = groupJsonObject["id"].int!
    self.name = groupJsonObject["name"].string!
}


class var sharedInstance : GroupObject {
    struct Static {
        static let instance : GroupObject = GroupObject(groupJsonObject: JSON) // this is the problem line.
    }
    return Static.instance

}


}

Upvotes: 2

Views: 1666

Answers (2)

Rob
Rob

Reputation: 437632

The problem is that you cannot pass a parameter to the singleton. Your singleton implementation doesn't know to what JSON refers.

If you want this to be a singleton, you'd have to initialize the groupJsonObject separately from the initialization of the shared instance. For example:

class GroupObject {
    var name: String!
    var id: Int!

    var groupJsonObject: JSON! {
        didSet {
            id = groupJsonObject["id"].int!
            name = groupJsonObject["name"].string!
        }
    }

    static let sharedInstance = GroupObject()   // btw, this is a more concise syntax for declaring a singleton
}

And then, when you want to initialize those properties, you could do:

GroupObject.sharedInstance.groupJsonObject = json

Upvotes: 5

Joshua Nozzi
Joshua Nozzi

Reputation: 61228

If your "singleton" is supposed to hold some data passed to it on instantiation, how will it get that data? Where/when is it available?

I think you don't actually want a singleton at all; you want an instance created with your JSON data to be accessible from different points in your application. In that case, pick some "master controller", create it there, then pass it along to other controllers as needed.

Upvotes: 1

Related Questions