为什么 SwiftUI 已经导入了 Combine 还需要导入它?

Why do I need to import Combine when SwiftUI already imports it?

我正在尝试聆听 @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)")
            }
    }
}

它没有编译:我得到“在范围内找不到 'Just'”

Just is part of the Combine framework。但是,我认为 SwiftUI 已经导入了 Combine?我命令-单击import SwiftUI,然后按Jump to Definition,它就在顶部。

Jump to Definition import Combine is at the top

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

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

一个完美的例子就是您遇到的情况,其中 SwiftUI 导入 Combine,但您不能在代码中使用 Just 而不显式导入 Combine 你自己。

但是,所有 时间都不是这样。例如,CGFloat 是在 CoreGraphics 中定义的,但是如果您导入 SwiftUI 就可以访问它。如果您只导入 Foundation,您 无法 访问它。当然,这不是一个完美的例子,因为你的问题引用了两个 Swift 框架,而 CoreGraphics 和 Foundation 来自 Objective-C 世界。

为了让您不必 导入Combine,SwiftUI 框架必须为您导出Combine。这可以使用 @_export:

来完成

因为这还没有完成,当你想使用它的类型时,你被困在导入 Combine 中,就像你必须导入 CoreData 如果你想使用 CoreData 类型,即使像 Combine,它是由 SwiftUI.

导入(但不导出)