Subclassing NSObject in Swift - Best Practice with Initializers
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.
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, 2020Comments
-
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 thansuper.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 about 6 yearsWhat if you want to init multiple properties? One is a string, another is a NSNumber, an array, etc.....
-
Charles A. about 6 yearsYou 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 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() }