Установите неопределенное свойство с новым значением объекта через другой класс в Swift - PullRequest
0 голосов
/ 11 октября 2018

У меня есть случай, когда я хочу иметь возможность установить значение какого-либо свойства объекта через другой класс.Однако:

  • Я не знаю / не хочу жестко задавать, какое свойство устанавливается,
  • и не знаю / не хочу жестко закодировать новое значение свойства

Пока у меня есть класс ValueSetterClass:

class ValueSetterClass<V, T>: NSObject where V: NSObject {

    var item: T?
    private var object: V
    private var key: String

    init(object: V, value: (HELP ME!)) {
        self.object = object
        self.key = #keyPath(value)
        super.init()
    }

    public func setValue() {
        object.setValue(item!, forKey: key)
    }

}

, где вы можете инициализировать класс изменяемым объектом и свойством, которое должно быть нацелено.Предполагается, что он будет вызываться так:

let view = UIView()
let valueSetter = ValueSetterClass<UIView, UIColor>(object: view, value: UIView.backgroundColor)
valueSetter.item = .yellow
valueSetter.setValue()

Однако я не могу понять, что мне следует поместить для типа value в инициализаторе (где я сказал HELP ME! ☹️)

Я знаю, что это должно работать, так как вы можете определить ключевую строку любого свойства:

print(#keyPath(UIView.backgroundColor)) // backgroundColor

Заранее спасибо за помощь!

PS Я не сумасшедший, у меня естьвеская причина для желания сделать это!?

1 Ответ

0 голосов
/ 11 октября 2018

@ Paulw11 решил это.Мне нужно было использовать новый KeyPath в Swift 4 вместо # keyPath.

Вот исправленный пример:

class ValueSetterClass<V, T>: NSObject where V: UIView {

    var item: T?
    private var object: V
    private var key: ReferenceWritableKeyPath<V, T>

    init(object: V, key: ReferenceWritableKeyPath<V, T>) {
        self.object = object
        self.key = key
        super.init()
    }

    public func setValue() {
        object[keyPath: key] = item!
    }

}

let view = UIView()
let valueSetter = ValueSetterClass(object: view, key: \.backgroundColor)
valueSetter.item = .yellow
valueSetter.setValue()

Спасибо!

...