使用枚举作为命名空间时,SwiftUI预览无法生成



由于Swift没有真正的一流命名空间支持,枚举经常被用作替换。当这样做时,SwiftUI预览不再构建:

import SwiftUI
enum Namespace { }
extension Namespace {
struct ContentView: View {
var body: some View {
VStack {
Text("ContentView")
.padding()
InnerView()
.padding()
}
}
}
struct InnerView: View {
var body: some View {
Text("InnerView")
}
}
}
#if DEBUG
struct NamespaceContentViewPreviews: PreviewProvider {
static var previews: some View {
Namespace.ContentView()
}
}
#endif

这产生了一个";未能建立ContentView.swift";诊断错误

编译失败:在作用域中找不到"InnerView">
/NamespaceTest/ContentView.swift:19:17:错误:在作用域中找不到"InnerView">

请注意,在构建应用程序时,代码编译和运行都很好,这只是我遇到的预览问题。

#if DEBUG之后添加typealias Innerview = Namespace.Innerview会有所帮助,但对于具有许多子视图的较大视图,这会变得非常乏味,非常快。

不幸的是,将PreviewProvider添加到名称空间并没有帮助——简单地将其移动到extension Namespace{}中会完全禁用预览,转发到命名空间结构也没有帮助:

extension Namespace {
struct ContentViewPreviews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
}
struct NamespaceContentViewPreviews: PreviewProvider {
static var previews: some View {
Namespace.ContentViewPreviews.previews
}
}

导致两个";在范围"中找不到X;错误:-(

该问题出现在Xcode 13.4.1和Xcode 14 beta 6中。

有没有其他/更简单的方法可以让SwiftUI预览在枚举/命名空间中工作?

您的代码有两个问题:

首先,Namespace是SwiftUI关键字,用于命名相关的MatchedGeometry。具有讽刺意味的是,您在名称空间中发生了冲突。我把你的Namespace改成了MyNamespace,错误就消失了。但它仍然不会运行。

其次,一旦使用了名称空间,就必须使用该名称空间。因此,您必须将Namespace.ContentView中的InnerView()称为Namespace.InnerView()。然后它将构建并运行。

所以,你的代码应该是:

enum MyNamespace { } // Here
extension MyNamespace { // Here
struct ContentView: View {
var body: some View {
VStack {
Text("ContentView")
.padding()
MyNamespace.InnerView() // Here
.padding()
}
}
}
struct InnerView: View {
var body: some View {
Text("InnerView")
}
}
}
struct Namespace_Previews: PreviewProvider {
static var previews: some View {
MyNamespace.ContentView()
}
}

最新更新