【问题标题】:is there any workaround to put stored properties into extensions in swift?是否有任何解决方法可以将存储的属性快速放入扩展中?
【发布时间】:2019-04-08 02:31:29
【问题描述】:

我正在使用代码创建我的项目,这有点令人困惑且难以阅读,因为我的代码中有几行只是为了设置 UIElements...

所以我尝试将这个庞大的部分插入到扩展中,并得到一个错误说存储的属性不能进入扩展,之后我的解决方案如下......

weak var centraliseButton: UIButton!
weak var infoButton: UIButton!
weak var seeFireButton: UIButton!
weak var locatManager: CLLocationManager!
weak var mapkitView: MKMapView!
weak var containerViewForInfoButton: UIView!
weak var containerViewForSeeFireButton: UIView!

然后我在扩展文件中的一个函数中设置了evertyhing,并在viewDidLoad() 中调用了这个函数,但是我再次遇到大量运行时错误和空值,因为我在其中一些属性中访问了self,它们是lazy var之前,所以我的最后一个解决方案如下:

lazy var centraliseButton: UIButton = UIButton()
lazy var infoButton: UIButton = UIButton()
lazy var seeFireButton: UIButton = UIButton()
lazy var locatManager: CLLocationManager = CLLocationManager()
lazy var mapkitView: MKMapView = MKMapView()
lazy var containerViewForInfoButton: UIView = UIView()
lazy var containerViewForSeeFireButton: UIView = UIView()

并在扩展中设置函数内的所有内容,它工作我没有错误,但它看起来对我来说是一个糟糕的解决方案,我不得不用“虚拟”值初始化它们,因为惰性 var 需要立即初始化所以……

这是一种不好的做法吗? 有没有更好的方法来做到这一点?

提前感谢您的回答!

【问题讨论】:

  • 他们为什么需要偷懒?

标签: swift xcode extension-methods


【解决方案1】:

我认为您有充分的理由不只是将这些属性存储在类本身中。

所以解决它的方法是使用 objc_getAssociatedObject 和 objc_setAssociatedObject。

例如,在您的扩展程序中,您可以输入:

struct AssociatedKeys 
{
    static var infoButton: UInt8 = 0
}

private(set) var infoButton: UIButton? 
{
    get 
    {
        guard let value = objc_getAssociatedObject(self, &AssociatedKeys.infoButton) as? UIButton else 
        {
            return nil
        }
        return value
    }
    set(newValue) 
    {
        objc_setAssociatedObject(self, &AssociatedKeys.infoButton, newValue, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC)
    }
}

【讨论】:

    猜你喜欢
    • 2010-11-17
    • 2016-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-18
    • 1970-01-01
    • 2020-12-23
    • 2012-05-17
    相关资源
    最近更新 更多