文本或图像等视图类型如何符合SwiftUI中的视图协议?

Mis*_*cha 9 view ios swift swiftui opaque-result-type

关于SwiftUI中的视图类型,有一件大事让我感到困惑

它们似乎不符合该View协议,但是某种程度上,它们却神秘地遵循了该协议。

Text类型为例。它的定义如下:

public struct Text : Equatable { ... }
Run Code Online (Sandbox Code Playgroud)

我找不到任何能增加View协议一致性的公共扩展,例如

extension Text: View { ... }
Run Code Online (Sandbox Code Playgroud)

官方文档中的“ 关系”部分仅指出:

符合: 平等

仅此而已。

但是,我可以返回一个需要Text一些实例的实例View,例如:

var body: some View {
    Text("I'm a View, I swear!") 
}
Run Code Online (Sandbox Code Playgroud)

如果Text不符合View,则将无法执行并引发编译器错误。

some View是一种不透明的结果类型,表示它是具有身份的特定类型,但符合View。)

那怎么可能呢?

在哪里View指定协议一致性SwiftUI视图类型(如TextImageCircle,...)?

rob*_*off 8

这个问题是在 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
Run Code Online (Sandbox Code Playgroud)

在该文件的 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
}
Run Code Online (Sandbox Code Playgroud)

你会发现这_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 {
}
Run Code Online (Sandbox Code Playgroud)

所以,在Xcode 11的β1和相应的iOS,MACOS,tvOS,和watchOS贝塔,Text符合View间接地通过其符合_UnaryView。由于_UnaryView是 SDK 的一部分并以 开头_,因此 Xcode 和 Apple 文档隐藏了该符号。所以你不能通过正常的方法看到一致性。

后来(但我相信,在 Xcode 11.0 测试版期间),Apple 取消了该_UnaryView协议并使其Text直接符合View. 因此,如果您检查.swiftinterfaceXcode 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
}
Run Code Online (Sandbox Code Playgroud)