Как получить значение 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
}
Другие вопросы по тегам