我有一个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)
。
1条答案
按热度按时间v64noz0r1#
就在我发布这篇文章之后,我走开了一会儿,思考了一下“编译源代码”。果然,Xcode为所选目标拉入了错误的文件。iOS目标是正确的,但macOS目标拉入了iOS文件,因此该目标具有macOS和iOS目标。我从“编译源代码”中删除了iOS文件,现在它可以工作了。
Xcode中的Bug?