Как получить значение Published<String> в swift без использования debugDescription?
У меня есть следующий код, который работает на игровой площадке. Я пытаюсь разрешить доступ индекса к переменным @Published в классе. Единственный способ, который я нашел до сих пор, чтобы получить значение String в приведенной ниже реализации getStringValue, - это использовать 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)")
1 ответ
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
}