有什么解决方法可以快速将存储的属性放入扩展中?

时间:2018-11-04 15:35:35

标签: swift xcode extension-methods

我正在用代码创建我的项目,这有点令人困惑且难以阅读,因为在我的代码中只需要设置几行即可设置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并且它们是{ {1}}之前,所以我的最后解决方法是:

lazy var

并在扩展中设置函数中的所有内容,它可以正常工作,但没有错误,但对我来说似乎是一个不好的解决方案,我必须使用“虚拟”值初始化所有参数,因为惰性var需要立即初始化所以...

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

预先感谢您的回答!

1 个答案:

答案 0 :(得分:0)

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

因此解决此问题的方法是使用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)
    }
}