Home > Enterprise >  swift Property not initialized at super.init call
swift Property not initialized at super.init call

Time:11-11

I have a class called badge that inherits from another class and I want the constructor method to tell the style of the notification.

but I'm having this error: Property 'self.notificationStyle' not initialized at super.init call

DefaultTableViewCell class

final public class DefaultTableViewCell: UITableViewCell

enum NotificationStyle {
        case numberedSquare, circle
    }
    
    var notificationStyle: NotificationStyle = .numberedSquare

my goal is whenever someone instantiates this Badge class, it will be necessary to inform the notificationStyle of it, being square or circular in this case.

how can i solve this?

Badge class

@objc public class Badge: NotifyLabel

var notificationStyle: DefaultTableViewCell.NotificationStyle

init(frame: CGRect, notificationStyle: DefaultTableViewCell.NotificationStyle) {
        self.notificationStyle = notificationStyle
        super.init(frame: frame)
        setup(notificationStyle: notificationStyle)
    }
    
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        setup(notificationStyle: notificationStyle)
    }
    
    init(notificationStyle: DefaultTableViewCell.NotificationStyle) {
        self.notificationStyle = notificationStyle
        super.init(frame: .zero)
        setup(notificationStyle: notificationStyle)
    }

func configureBadgeNotificationStyle(notificationStyle: DefaultTableViewCell.NotificationStyle) {
        textAlignment = NSTextAlignment.center
        layer.borderWidth = 1
        layer.borderColor = Color.bostonRed.cgColor
        clipsToBounds = true
        textStyle = .label
        backgroundColor = Color.white
        
        switch notificationStyle {
        case .circle:
            layer.cornerRadius = 8
        default:
            layer.cornerRadius = 2
        }
    }
    
    private func setup(notificationStyle: DefaultTableViewCell.NotificationStyle) {
        configureBadgeNotificationStyle(notificationStyle: notificationStyle)
        configureAccessibility()
    }


NotifyLabel class

public class NotifyLabel: UILabel

public init(textStyle: TextStyle) {
        self.textStyle = textStyle
        super.init(frame: .zero)
        applyTextStyle()
    }
    
    public override init(frame: CGRect) {
        super.init(frame: frame)
        applyTextStyle()
    }
    
    public required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        applyTextStyle()
    }

CodePudding user response:

You can fix this by adding a line to set notificationStyle to a default value in init?(coder aDecoder: NSCoder):

required init?(coder aDecoder: NSCoder) {
    self.notificationStyle = .numberedSquare //<-- Here
    super.init(coder: aDecoder)
    setup(notificationStyle: notificationStyle)
}

You have to do this because in your declaration of notificationStyle, there's no default value and it must have a value before calling super.init. In your other initializers, you set it based on the incoming arguments.

This is an initializer that it sounds like you're not using anyway, but it is required with UIViews that we implement this required initializer.

  • Related