由于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()
}
}