Subclassing NSObject in Swift - Best Practice with Initializers

43,072

Solution 1

I'm not Swift ninja but I would write MyClass as:

class MyClass: NSObject {
    
    var someProperty: NSString // no need (!). It will be initialised from controller 
    
    init(fromString string: NSString) {
        self.someProperty = string
        super.init() // can actually be omitted in this example because will happen automatically.
    }
    
    convenience override init() {
        self.init(fromString:"John") // calls above mentioned controller with default name
    }        
}

See the initialization section of the documentation

Solution 2

If someProperty can be nil, then I think you want to define the property as:

var someProperty: NSString?

This also eliminates the need for a custom initializer (at least, for this property), since the property doesn't require a value at initialization time.

Share:
43,072
Woodstock
Author by

Woodstock

From Ireland, interested in iOS, macOS & Linux development, cryptography, math, music, technology, running, lifting and good food... Currently working in Architecture and Applied Cryptography.

Updated on December 28, 2020

Comments

  • Woodstock
    Woodstock over 3 years

    Here is the layout of an example Class, can someone guide me on what's best practice when creating a subclass of NSObject?

    class MyClass: NSObject {
    
        var someProperty: NSString! = nil
    
        override init() {
            self.someProperty = "John"
            super.init()
        }
    
        init(fromString string: NSString) {
            self.someProperty = string
            super.init()
        }
    
    }
    

    Is this correct, am I following best practice here?

    I wonder if I'm correctly setting up the initializers (one that sets the string to a default, and one which I can pass in a string)?

    Should I call super.init() at the end of each of the initializers?

    Should my more specific (the one that takes a string) initializer simply call self.init() at the end rather than super.init()?

    What is the right way to set up the initializers in Swift when subclassing NSObject? - and how should I call the super init ?

    This question (albeit in Objective C) suggests you should have an init, which you always call and simply set the properties in more specific inits: Objective-C Multiple Initialisers

  • Supertecnoboff
    Supertecnoboff about 6 years
    What if you want to init multiple properties? One is a string, another is a NSNumber, an array, etc.....
  • Charles A.
    Charles A. about 6 years
    You cannot call super.init() prior to initializing non-optional fields that do not have a default value in their declaration. In this case it would work because the property is an optional type: NSString!.
  • user1898712
    user1898712 over 5 years
    @Supertecnoboff you would add each of them into the initialiser method, ie: init(with name: NSString, age: NSNumber, children: [NSString]) { self.name = name self.age = age self.children = children super.init() }