Есть ли обходной путь, чтобы поместить сохраненные свойства в расширения в Swift? - PullRequest
0 голосов
/ 04 ноября 2018

Я создаю свой проект полностью в коде, и он был немного запутанным и трудным для чтения, потому что в моем коде было несколько строк, чтобы настроить 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(), но снова я получил тонны ошибок времени выполнения и нулей, потому что я получаю доступ к себе внутри некоторых из этих свойств, и они 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()

и установил все внутри функции в расширении, это сработало, я не получил ошибок, но это выглядит как плохое решение для меня, мне пришлось инициализировать их все с помощью «фиктивного» значения, потому что lazy var требует немедленной инициализации так что ...

Это плохая практика? Есть ли лучший способ сделать это?

Заранее спасибо за ответы!

1 Ответ

0 голосов
/ 04 ноября 2018

Полагаю, у вас есть действительно веская причина не просто хранить эти свойства в самом классе.

Таким образом, чтобы обойти это, используйте 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)
    }
}
...