Скопируйте UIView с сохраненной переменной расширения UIView - PullRequest
0 голосов
/ 22 января 2019

Я хочу создать копию UIView, а также скопировать дополнительную переменную, используя расширения.

Чтобы скопировать UIView, который я использую: (из Создать копию UIView в Swift )

extension UIView
{
    func copyView<T: UIView>() -> T {
        return NSKeyedUnarchiver.unarchiveObject(with: NSKeyedArchiver.archivedData(withRootObject: self)) as! T
    }
}

Чтобы добавить переменную в UIView, я использую: https://marcosantadev.com/stored-properties-swift-extensions/

extension PropertyStoring {
    func getAssociatedObject(_ key: UnsafeRawPointer!, defaultValue: T) -> T {
        guard let value = objc_getAssociatedObject(self, key) as? T else {
            return defaultValue
        }
        return value
    }
}

enum ToggleState {
    case on
    case off
}


extension UIView: PropertyStoring {
    typealias T = ToggleState
    private struct CustomProperties {
        static var toggleState = ToggleState.off
    }
    var toggleState: ToggleState {
        get {
            return getAssociatedObject(&CustomProperties.toggleState, defaultValue: CustomProperties.toggleState)
        }
        set {
            return objc_setAssociatedObject(self, &CustomProperties.toggleState, newValue, .OBJC_ASSOCIATION_RETAIN)
        }
    }
}

Однако при копировании UIView его подпредставления не будут сохранять правильное состояние переключения.

Кто-нибудь получил решение, которое может не только скопировать UIView, но и сохранить переменные из расширения?

P.S. Я не могу использовать подкласс в качестве решения

...