是否可以在扩展中使用非只读计算属性?

Posted

技术标签:

【中文标题】是否可以在扩展中使用非只读计算属性?【英文标题】:Is it possible use non read-only computed property in extension? 【发布时间】:2016-02-23 23:46:55 【问题描述】:

扩展中的计算属性是否可以同时具有 getter 和 setter? Apple 的指南没有提到它,我看到的唯一示例仅显示扩展中的只读计算属性。

【问题讨论】:

如何编写计算属性?还是我不明白这个问题? 表示使用 setter 的计算属性,而不仅仅是 getter。 【参考方案1】:

这行得通:

extension Bool

    public var integerValue: Int
    
        get
        
            return true ? 1 : 0
        

        set
        
            self = (newValue > 0) ? true : false
        
    

所以是的

【讨论】:

所以它似乎仅限于不必使用存储属性来存储状态的设置器。 不能在扩展中定义存储属性。 “不必使用存储的属性来存储状态”让我困惑了一秒钟。我以为你在谈论访问 inside setter 的属性。 是的,您不能在扩展中定义存储的属性。 @nhgrif:我仍然坚持我的说法。手动使用运行时将值与对象关联起来并不等同于在扩展中定义存储属性。【参考方案2】:

扩展中的计算属性是否可能具有 getter 和 setter?

是的。

根据我的经验,扩展中计算属性的最常见用途之一可能是提供一个包装器,以便更轻松地访问特定属性。

例如,当我们想要修改UIKit 之外的任何东西的边框层、边框颜色或圆角半径时,我们会遇到layer 属性。

但是我们可以扩展UIView 的属性,同时具有 setter 和 getter,以提供更方便的方法来更改其层的属性:

extension UIView 
    var borderColor: UIColor? 
        get 
            guard let color = self.layer.borderColor else 
                return nil
            
            return UIColor(CGColor: color)
        
        set 
            self.layer.borderColor = newValue?.CGColor
        
    

此外,如果我们真的想要,我们可以利用 Objective-C 运行时来模拟扩展中存储的属性(这当然意味着设置和获取)。以this Stack Overflow answer为例:

private var kAssociationKeyNextField: UInt8 = 0

extension UITextField 
    @IBOutlet var nextField: UITextField? 
        get 
            return objc_getAssociatedObject(self, &kAssociationKeyNextField) as? UITextField
        
        set(newField) 
            objc_setAssociatedObject(self, &kAssociationKeyNextField, newField, .OBJC_ASSOCIATION_RETAIN)
        
    

这只是带有 setter 和 getter 的扩展中的一个属性示例。

【讨论】:

以上是关于是否可以在扩展中使用非只读计算属性?的主要内容,如果未能解决你的问题,请参考以下文章

Python面向对象编程第19篇 只读属性

Python面向对象编程第19篇 只读属性

数据结构

使用反射更改只读属性

是否可以在 iOS 中使用 KVC 将值设置为只读属性?

Swift get和set方法以及只读属性(计算型属性,本身不保存数据,都是通过计算获得结果)