这个问题是在 2019 年 6 月 6 日的 WWDC 期间提出的,当时我们只有 Xcode 11 和 SwiftUI 的第一个测试版。所以正确回答这个问题需要访问该版本的 SwiftUI。你可以download Xcode 11 beta 1 here。 (谢谢xcodereleases.com!)不过,您正在尝试解压档案,因为(我认为)它是用一个已经过期的证书签署的。我使用了黑魔法(在LLDB中单步执行xip命令,并在关键时刻修改内存以颠覆证书验证)。您或许可以在解包之前将系统时间设置回 2019 年 6 月 6 日。
无论如何,这就是理解为什么 Text 似乎不符合 View 的秘诀:Xcode 和 Apple 的文档生成器有意省略了 SDK 中以 _ 开头的标识符。
因此,如果您想查看一个类型的完整公共声明,您不能依赖 Xcode 或文档来向您展示它。相反,您必须为模块挖掘 .swiftinterface 文件。对于 SwiftUI,你可以在这里找到它,相对于 Xcode.app 目录:
Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/SwiftUI.framework/Modules/SwiftUI.swiftmodule/arm64.swiftinterface
在该文件的 Xcode 11 beta 1 版本中,您找不到直接一致性 Text: View。相反,你会发现:
@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *)
extension Text : _UnaryView {
public static func _makeView(view: _GraphValue<Text>, inputs: _ViewInputs) -> _ViewOutputs
public typealias Body = Swift.Never
}
你会发现_UnaryView是View的一个子协议:
@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *)
public protocol _UnaryView : SwiftUI.View where Self.Body : SwiftUI._UnaryView {
}
因此,在 Xcode 11 beta 1 和相应的 iOS、macOS、tvOS 和 watchOS beta 中,Text 通过与 _UnaryView 的一致性间接符合 View。由于_UnaryView 是SDK 的一部分并且以_ 开头,因此Xcode 和Apple 文档隐藏了该符号。所以通过普通的方法是看不到一致性的。
在稍后的某个时间点(但我相信,在 Xcode 11.0 测试版期间),Apple 取消了_UnaryView 协议,并使Text 直接符合View。因此,如果您检查 Xcode 11.4(我写这篇文章时的当前版本)中的 SwiftUI .swiftinterface 文件,您会发现:
@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *)
extension Text : SwiftUI.View {
public static func _makeView(view: SwiftUI._GraphValue<SwiftUI.Text>, inputs: SwiftUI._ViewInputs) -> SwiftUI._ViewOutputs
public typealias Body = Swift.Never
}