如何修复在不同目标中使用相同类名时的Xcode错误“无效的重新声明”?

blmhpbnm  于 2023-08-07  发布在  其他
关注(0)|答案(1)|浏览(106)

我有一个Xcode SwiftUI项目,我希望有一个macOS和iOS应用程序。在应用程序的一个特定部分,我想使用SwiftUI Image。在SwiftUI中,在macOS上是Image(nsImage: ),在iOS上是Image(uiImage: )。但是,它所使用的类名为Settings,所以我认为我应该创建macOS和iOS目标,使用不同的文件,但这些文件具有相同的类名,而不是使用#if os(iOS)。这个想法是,每个文件将在一个不同的目标,所以Xcode应该只编译该目标的文件。然而,Xcode给我一个错误,我得到了一个类的重新声明。为什么?如果文件在不同的目标中,为什么Xcode关心不在所选目标中的文件?
以下是我的最小示例:

struct TargetTestApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}

字符串
正如你所看到的,当你创建一个SwiftUI项目时,Xcode会创建一个名为ContentView的文件和类。在这个类里面有一个Text,它说“Hello world”。我把它改成了“你好,麦克”。

struct ContentView: View {
    var body: some View {
        VStack {
            Image(systemName: "globe")
                .imageScale(.large)
                .foregroundColor(.accentColor)
            Text("Hello, Mac!")
        }
        .padding()
    }
}


因此,我创建了一个名为“TargetTestApp-iOS”的目标,并复制了ContentView文件,并将其命名为ContentView-iOS.swift。这是内容:

struct ContentView: View {
    var body: some View {
        VStack {
            Image(systemName: "globe")
                .imageScale(.large)
                .foregroundColor(.accentColor)
            Text("Hello, Phone!")
        }
        .padding()
    }
}


这个想法是,当从TargetTestApp调用ContentView()时,编译器应该只编译附加到当前目标的文件,但事实并非如此-它正在拉入两个文件。因此,当我构建macOS目标时,ContentView应该只引用macOS文件,iOS目标构建应该排除macOS文件并包含iOS目标。Xcode似乎没有做到这一点。
ContentView-iOS.swift不是macOS目标的一部分,只是iOS目标的成员:
x1c 0d1x的数据
这是macOS文件的成员。请注意,它只是macOS目标的一部分:



那么,为什么Xcode告诉我,当它不应该查看不属于当前目标的文件时,有一个无效的重新声明?目标系统的全部要点不就是包含/排除文件吗?
任何帮助将不胜感激,因为我真的试图避免使用#if(os)

v64noz0r

v64noz0r1#

就在我发布这篇文章之后,我走开了一会儿,思考了一下“编译源代码”。果然,Xcode为所选目标拉入了错误的文件。iOS目标是正确的,但macOS目标拉入了iOS文件,因此该目标具有macOS和iOS目标。我从“编译源代码”中删除了iOS文件,现在它可以工作了。
Xcode中的Bug?

相关问题