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

Posted

技术标签:

【中文标题】扩展可能不包含存储的属性【英文标题】:Extensions May not contain Stored properties 【发布时间】:2016-03-31 15:20:44 【问题描述】:

我可以在不需要继承的情况下在 Swift 中使用 Extensions 实现这一点吗? 我收到这个错误 扩展可能不包含存储属性

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
        
    

【讨论】:

此技术有效,但不会更新 xib/storyboard 中的 UI。 设置后做setNeedsLayout()【参考方案2】:

扩展无法添加存储属性。来自docs(计算属性部分):

注意

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

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

class CustomButton : UIButton

    @IBInspectable var borderWidth : CGFloat
        
        didSet
            layer.borderWidth = borderWidth
        
    


【讨论】:

我不想存储变量我想从界面生成器中更改 layer.borderWidth dan 的答案可能对你有用,但我担心UIButton 在调用 getter/setter 之前可能没有完全初始化。【参考方案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
    

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

【讨论】:

以上是关于扩展可能不包含存储的属性的主要内容,如果未能解决你的问题,请参考以下文章

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

目标 C 和 Swift 互操作性导致错误“扩展可能不包含存储的属性”

想要保存核心数据,但“扩展不得包含存储的属性”

可扩展数据库模式 - 如何存储可扩展属性值

扩展中的延迟加载属性(Swift)

具有存储属性的扩展