我使用 FirebaseAnalytics 来View.analyticsScreen(type(of: self))
记录我的视图。这很好用:当我有一个名为的视图时MyBeautifulView
,就会记录该视图。但是,我不必import FirebaseAnalytics
每次都这样做,而是继续在 View 上创建扩展
func analyticsScreen() -> some View {
analyticsScreen(name: "\(type(of: self))")
}
我注意到,使用上述方法时,输出type(of: self)
类似于
_ConditionalContent<_ConditionalContent<ModifiedContent<ModifiedContent<ModifiedContent<ModifiedContent<ModifiedContent<ModifiedContent<List<Never,TupleView<(Optional<Section<Text,ForEach<Array,Optional,ModifiedContent<ModifiedContent...
我原本希望它是视图的名称。为什么它不显示名称?我怎样才能获得我想要的行为?这是个功能吗?(当然我可以通过参数传递结构名称,但我想知道是否有更好的方法)。
另外,这不是 Firebase 问题,这就是为什么我没有将其标记为 Firebase 问题。如果我执行 ,也会发生这种情况print(type(of: self))
。
self
根据上下文有不同的含义。self
指的是您调用的值analyticsScreen()
。因此,如果您这样做self
将Text("Foo")
。如果前面有一堆修饰符
.analyticsScreen()
,那您看到的就会ModifiedContent<...>
很乱。当您
self
在视图中使用时,它指的是已调用的body
任何值。显然,这将始终是视图结构的一个实例。body
简而言之,这可以归结为:
没有办法解决这个问题。函数无法知道它从哪里(即哪种类型)被调用。您需要将其
self
作为参数传递:我还建议直接传递元类型,这样您就不需要了
type(of:)
。如果你真的讨厌这个参数,那么折衷的办法是使用文件 ID: