当 SwiftUI 已经导入合并时,为什么我还需要导入它?

ahe*_*eze 5 ios swift swiftui combine

我正在尝试倾听@State变化并遵循这个答案。这是我的代码:

import SwiftUI

struct ContentView: View {
    @State var isOn = false
    
    var body: some View {
        Toggle("Selection", isOn: $isOn)
            .onReceive(Just(isOn)) { isOn in
                print("Toggle is on? \(isOn)")
            }
    }
}
Run Code Online (Sandbox Code Playgroud)

它无法编译:我得到“无法在范围内找到‘Just’”

在包含“Just”的行突出显示的范围内找不到“Just”

Just是组合框架的一部分。但是,我以为SwiftUI已经导入了Combine?我Command单击import SwiftUI,然后按Jump to Definition,它就位于顶部。

跳转到定义 import Combine位于顶部
跳转到弹出菜单中的定义 SwiftUI 文件的第 1 行是 import Combine

一旦我添加import Combine到我的代码中,它就会编译。但这不应该是多余和不必要的吗?

构建成功

jn_*_*pdx 8

仅仅因为您从某个框架/库(模块 A)导入并不自动意味着您可以访问您刚刚 导入的文件中模块 A 导入的所有类型(模块 B、C、D)A

一个完美的例子就是您正在经历的情况,其中SwiftUIimport Combine,但如果不显式导入自己,则无法Just在代码中使用Combine

然而,情况并非总是如此。例如,CGFloat是在 中定义的CoreGraphics,但如果导入 则可以访问它SwiftUI。如果您导入Foundation. 当然,这不是一个完美的例子,因为你的问题引用了两个 Swift 框架,而 CoreGraphics 和 Foundation 来自 Objective-C 世界。

为了让您不必导入CombineSwiftUI 框架必须为您导出合并。这可以使用以下方法完成@_export

由于尚未完成此操作,因此Combine当您想要使用其类型时,您会陷入导入困境,就像您CoreData想要使用CoreData类型时必须导入一样,即使像 一样Combine,它是由 SwiftUI导入(但不导出)的。