У меня есть следующий код, который работает на игровой площадке. Я пытаюсь разрешить доступ индекса к переменным @Published в классе. Единственный способ, который я нашел до сих пор, чтобы получить значение String в приведенной ниже реализации получитьStringValue заключается в использовании debugDescription и извлечении его - я просмотрел интерфейс для Published, но не могу найти способ получить значение в такой функции, как getStringValue
Любые указатели будут очень признательны :)
Отредактировано, чтобы включить пример того, как это работает с неопубликованной переменной.
Ваше здоровье
import Foundation
import Combine
protocol PropertyReflectable {}
extension PropertyReflectable {
subscript(key: String) -> Any? {
return Mirror(reflecting: self).children.first { $0.label == key }?.value
}
}
class Foo : PropertyReflectable {
@Published var str: String = "bar"
var str2: String = "bar2"
}
// it seems like there should be a way to get the Published value without using debugDescription
func getStringValue(_ obj: Combine.Published<String>?) -> String? {
if obj == nil { return nil }
let components = obj.debugDescription.components(separatedBy: "\"")
return components[1]
}
let f = Foo()
let str = getStringValue(f["_str"] as? Published<String>)
print("got str: \(str!)")
// str == "bar" as expected
let str2 = f["str2"]!
print("got non-published string easily: \(str2)")
Мне не нужно событие или уведомление об изменениях в переменной str — я просто хочу получить ее синхронным методом — я не думаю, что .handleEvent или .sink заменят текущую реализацию getStringValue, но если они могут как-то, я хотел бы услышать больше подробностей :). Я немного обновил свой вопрос, чтобы отразить это.
Почему тогда вы используете Published?
Событие @ Published обрабатывается в другом месте другим кодом, поэтому мне нужно @ Published по другим причинам. В этом случае я хотел бы, чтобы f["str"] (или f["_str"]) работал аналогично f["str2"] или в основном реализовывал getStringValue без использования debugDescription. Похоже, должен быть способ получить фактическое значение переменной, просто я его не вижу.
Рассматривали ли вы возможность использования «CurrentValueObject»?





Published, похоже, пропитан некоторой магией компилятора из-за отсутствия лучшей формулировки, поскольку его можно использовать только как оболочку свойств внутри классов.
При этом, будет ли что-то подобное работать?
final class PublishedExtractor<T> {
@Published var value: T
init(_ wrapper: Published<T>) {
_value = wrapper
}
}
func extractValue<T>(_ published: Published<T>) -> T {
return PublishedExtractor(published).value
}
Вы можете использовать .handleEvent или .sink