扩展名可能不包含存储的属性

时间:2016-03-31 15:20:44

标签: ios swift inheritance

我可以在Swift with Extensions中实现它而不需要继承吗? 我收到这个错误 扩展名可能不包含存储的属性

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

}

3 个答案:

答案 0 :(得分:51)

您可以覆盖setter / getter,使其不是存储属性,只是将set / get转发给图层。

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

        get {
            return layer.borderWidth
        }
    }
}

答案 1 :(得分:10)

扩展程序无法添加存储的属性。从docs(计算属性部分):

  

请注意

     

扩展可以添加新的计算属性,但它们无法添加存储   属性,或将属性观察者添加到现有属性。

如果您需要存储属性,则应创建一个子类,如下所示:

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

}

答案 2 :(得分: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
    }
}

我希望这会对某人有所帮助。