Doug Smith Doug Smith - 6 months ago 30
Swift Question

How do I write a custom init for a UIView subclass in Swift?

Say I want to

init
a
UIView
subclass with a
String
and an
Int
.

How would I do this in Swift if I'm just subclassing
UIView
? If I just make a custom
init()
function but the parameters are a String and an Int, it tells me that "super.init() isn't called before returning from initializer".

And if I call
super.init()
I'm told I must use a designated initializer. What should I be using there? The frame version? The coder version? Both? Why?

Answer

The init(frame:) version is the default initializer. You must call it only after initializing your instance variables. If this view is being reconstituted from a Nib then your custom initializer will not be called, and instead the init(coder:) version will be called. Since Swift now requires an implementation of the required init(coder:), I have updated the example below and changed the let variable declarations to var and optional. In this case, you would initialize them in awakeFromNib() or at some later time.

class TestView : UIView {
    var s: String?
    var i: Int?
    init(s: String, i: Int) {
        self.s = s
        self.i = i
        super.init(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
    }

    required init(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }
}