Eu uso o FirebaseAnalytics View.analyticsScreen(type(of: self))
para registrar minhas Views. Isso funciona bem: quando eu tenho uma View chamada MyBeautifulView
, então exatamente isso está sendo registrado. No entanto, em vez de ter que fazer isso import FirebaseAnalytics
toda vez, eu fui em frente e criei uma extensão em View
func analyticsScreen() -> some View {
analyticsScreen(name: "\(type(of: self))")
}
Notei que ao usar o método acima, a saída type(of: self)
é algo como
_ConditionalContent<_ConditionalContent<ModifiedContent<ModifiedContent<ModifiedContent<ModifiedContent<ModifiedContent<Lista<Nunca, TupleView<(Opcional<Seção<Texto, ForEach<Matriz, Opcional, ModifiedContent<ModifiedContent...
Eu esperava que fosse o nome da View. Por que não está mostrando o nome e como posso obter o comportamento desejado? Isso é um recurso? (claro que eu poderia simplesmente passar o nome da struct por um parâmetro, mas gostaria de saber se há uma maneira melhor).
Também não é um problema do Firebase, e é por isso que não o rotulei como tal. Também acontece se eu apenas fizer print(type(of: self))
.
self
significa coisas diferentes dependendo do contexto. Emself
refere-se ao valor no qual você chamouanalyticsScreen()
. Então se você fizerself
vai serText("Foo")
.Se você tiver vários modificadores antes de
.analyticsScreen()
, será aModifiedContent<...>
bagunça que você verá.Quando você usa
self
inbody
da sua view, ele se refere a qualquer valorbody
que tenha sido chamado. Obviamente, isso sempre será uma instância da sua view struct.Para simplificar, isso se resume a:
Não há como contornar isso. Uma função não pode saber de onde (como em, qual tipo) foi chamada. Você precisa passar
self
como parâmetro:Eu também sugeriria passar o metatipo diretamente para que você não precise de
type(of:)
.Se você realmente odeia esse parâmetro, um meio-termo pode ser usar o ID do arquivo: