为什么 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
:
来完成
- https://forums.swift.org/t/exported-and-fixing-import-visibility/9415/3
- https://thoughtbot.com/blog/swift-imports
因为这还没有完成,当你想使用它的类型时,你被困在导入 Combine
中,就像你必须导入 CoreData
如果你想使用 CoreData
类型,即使像 Combine
,它是由 SwiftUI.
导入(但不导出)
我正在尝试聆听 @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
:
- https://forums.swift.org/t/exported-and-fixing-import-visibility/9415/3
- https://thoughtbot.com/blog/swift-imports
因为这还没有完成,当你想使用它的类型时,你被困在导入 Combine
中,就像你必须导入 CoreData
如果你想使用 CoreData
类型,即使像 Combine
,它是由 SwiftUI.