这个问题是在 2019 年 6 月 6 日的 WWDC 期间提出的,当时我们只有 Xcode 11 和 SwiftUI 的第一个测试版。所以正确回答这个问题需要访问该版本的 SwiftUI。您可以在此处下载 Xcode 11 beta 1。(谢谢你,xcodereleases.com!)不过,你正在尝试解压存档,因为(我认为)它是用一个已经过期的证书签名的。我使用了黑魔法(xip
在 LLDB 中单步执行命令并在关键时刻修改内存以破坏证书验证)。您或许可以在解包之前将系统时间设置回 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
,View
通过其对_UnaryView
. 由于_UnaryView
是 SDK 的一部分并以 开头_
,Xcode 和 Apple 文档隐藏了该符号。所以你不能通过正常的方法看到一致性。
在稍后的某个时间点(但我相信,在 Xcode 11.0 测试版期间),Apple 取消了该_UnaryView
协议并Text
直接符合View
. 因此,如果您检查.swiftinterface
Xcode 11.4(我写这篇文章时的当前版本)中的 SwiftUI 文件,您会发现:
@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
}