Как исправить атрибут "@IBInspectable" не имеет смысла для свойства, которое не может быть представлено в Objective-C "

В Xcode 9 и Swift 4 я всегда получаю это предупреждение для некоторых свойств IBInspectable:

    @IBDesignable public class CircularIndicator: UIView {
        // this has a warning
        @IBInspectable var backgroundIndicatorLineWidth: CGFloat? {  // <-- warning here
            didSet {
                backgroundIndicator.lineWidth = backgroundIndicatorLineWidth!
            }
        }

    // this doesn't have a warning
    @IBInspectable var topIndicatorFillColor: UIColor? {
        didSet {
            topIndicator.fillColor = topIndicatorFillColor?.cgColor
        }
    }
}

Есть ли способ избавиться от него?

Ответ 1

Может быть.

Точная ошибка (не предупреждение), которую я получил при выполнении копирования/вставки класса CircularIndicator: UIView:

Свойство не может быть помечено как @IBInspectable, потому что его тип не может быть представленный в Objective-C

Я решил это, сделав это изменение:

@IBInspectable var backgroundIndicatorLineWidth: CGFloat? {  // <-- warning here
    didSet {
        backgroundIndicator.lineWidth = backgroundIndicatorLineWidth!
    }
}

To:

@IBInspectable var backgroundIndicatorLineWidth: CGFloat = 0.0 {
    didSet {
        backgroundIndicator.lineWidth = backgroundIndicatorLineWidth!
    }
}

Конечно, backgroundIndicator undefined в моем проекте.

Но если вы кодируете didSet, похоже, вам просто нужно определить значение по умолчанию вместо того, чтобы сделать backgroundIndicatorLineWidth необязательным.

Ответ 2

Ниже двух пунктов может помочь вам

  • Поскольку в объекте c нет понятия опционального, поэтому дополнительная опция IBInspectable вызывает эту ошибку. Я удалил опцию и предоставил значение по умолчанию.

  • Если вы используете некоторые типы перечислений, напишите @objc перед этим перечислением, чтобы удалить эту ошибку.

Ответ 3

Свифт - 5

//Change this with below
@IBInspectable public var shadowPathRect: CGRect!{
    didSet {
        if shadowPathRect != oldValue {
            setNeedsDisplay()
        }
    }
}

Для

@IBInspectable public var shadowPathRect: CGRect = CGRect(x:0, y:0, width:0, height:0) {
    didSet {
        if shadowPathRect != oldValue {
            setNeedsDisplay()
        }
    }
}