Расширения Не могут содержать сохраненные свойства
Могу ли я реализовать это в 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
}
}
Надеюсь, это поможет кому-то.