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视图类型(如Text
,Image
,Circle
,...)?这个问题是在 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
. 因此,如果您检查.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
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
424 次 |
最近记录: |