Расширения Не могут содержать сохраненные свойства

Могу ли я реализовать это в Swift с расширениями без необходимости наследования?. Я получаю эту ошибку Расширения Не могут содержать сохраненные свойства

extension UIButton
{
    @IBInspectable var borderWidth : CGFloat
        {
        didSet{
            layer.borderWidth = borderWidth
        }
    }

}

Ответы

Ответ 1

Вы можете переопределить setter/getter так, чтобы он не был сохраненным свойством и просто переместил set/get к слою.

extension UIButton {
    @IBInspectable var borderWidth : CGFloat {
        set {
            layer.borderWidth = newValue
        }

        get {
            return layer.borderWidth
        }
    }
}

Ответ 2

Расширения не могут добавлять хранимые свойства. Из docs (раздел "Вычислимые свойства" ):

Примечание

Расширения могут добавлять новые вычисленные свойства, но они не могут добавлять сохраненные свойства или добавить наблюдателей свойств к существующим свойствам.

Если у вас есть потребность в сохраненных свойствах, вы должны создать подкласс, например:

class CustomButton : UIButton
{
    @IBInspectable var borderWidth : CGFloat
        {
        didSet{
            layer.borderWidth = borderWidth
        }
    }

}

Ответ 3

В Swift я импортирую статическую библиотеку, написанную в Objective-C. В приведенном ниже протоколе в этой библиотеке есть метод и свойство.

@class Message;

@protocol LocalService 

@property (readonly) int action;

- (Message *)getResponse:(Message *)request;

@end

Попытка сопоставить класс с этим протоколом, выдает следующие сообщения:

1-) Тип 'ShowInitialViewLocalService' не соответствует протоколу LocalService

2-) Расширения могут не содержать сохраненные свойства

Приведенный ниже код исправляет эту проблему:

import UIKit

class ShowInitialViewLocalService: NSObject{

}

extension ShowInitialViewLocalService : LocalService {

    var action: Int32 {
        get { return View.InitialView.rawValue }
    }

    func getResponse(_ request: Message) -> Message {
        let response = Response(source: request.target, target: request.source, relatedView: View.InitialView.rawValue, action: request.action, data: request.data)
        return response
    }
}

Надеюсь, это поможет кому-то.