Doug Smith Doug Smith - 1 year ago 86
Swift Question

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

Say I want to

subclass with a
and an

How would I do this in Swift if I'm just subclassing
? If I just make a custom
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
I'm told I must use a designated initializer. What should I be using there? The frame version? The coder version? Both? Why?

Answer Source

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)