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

Moh*_*din 31 inheritance ios swift

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

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

}
Run Code Online (Sandbox Code Playgroud)

dan*_*dan 54

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

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

        get {
            return layer.borderWidth
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 此技术有效,但它不会更新xib/storyboard中的UI. (5认同)
  • 设置后执行`setNeedsLayout()`。 (2认同)

Ale*_*der 11

扩展无法添加存储的属性.从文档(计算属性部分):

注意

扩展可以添加新的计算属性,但不能添加存储的属性,也不能将属性观察者添加到现有属性.

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

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

}
Run Code Online (Sandbox Code Playgroud)


Emr*_*ses 5

在 Swift 中,我导入了一个用 Objective-C 编写的静态库。下面的协议,在那个库中,有一个方法和一个属性。

@class Message;

@protocol LocalService 

@property (readonly) int action;

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

@end
Run Code Online (Sandbox Code Playgroud)

试图让一个类符合该协议,传递以下消息:

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
    }
}
Run Code Online (Sandbox Code Playgroud)

我希望这会帮助某人。