繁体   English   中英

如何在不继承 SwiftUI 中其他已定义视图的情况下制作正文,苹果最初是如何做到的?

[英]How can I make body without inheriting from other defined View in SwiftUI, How apple done this at first place?

我喜欢在不使用继承的情况下学习和了解 View 的创建,例如为了显示我的目标,我创建了一个名为Color2的新类型 View,它按预期工作,但事实上它继承自定义明确的 Color,所以如果我想要使 Color2 独立,而不是从我必须创建或返回的任何东西继承body ,否则Color2不会被 SwiftUI 编译! 这更像是先有鸡还是先有蛋?

Apple 是如何让Color一开始就独立存在甚至存在的? Apple 在做 Color View 的时候,他们也应该考虑 Color 的 body,但是 Apple 只是在创建 Color,他们甚至不能像我在代码中那样继承! 因为没有要继承的颜色视图!!!

所以问题/问题是如何在没有符合视图的引用/定义视图的情况下返回正文 (看!我想在没有鸡的情况下创建鸡蛋)

这个向下的代码工作,它们只是伪代码:

struct ContentView: View {

    var body: some View {
        
        Color2.red
        
    }
}

enum Color2 { case red, black }

extension Color2: View {

    public var body: some View {

        switch self {
        
        case Color2.red: Color.red      // <<: Here: how can I return a View if I want not using defined View! 
        case Color2.black: Color.black  // <<: Here: how can I return a View if I want not using defined View!
 
        }
    }

}

所以问题/问题是如何在没有符合视图的引用/定义视图的情况下返回正文?

你不能。

作为 SwiftUI 的用户,您可以这样做:

  • 您可以通过实现body方法来创建符合View的类型。

  • 您创建符合View的类型的实例并将它们传递给函数或从函数返回它们。

以下是你不做的事情:

  • 您不会向View询问它的body

SwiftUI 框架向View请求其body 你永远不会。

诀窍是 SwiftUI 并不总是View询问它的body

SwiftUI 知道一些特定的“原始” View类型。 当 SwiftUI 需要渲染(或布局)原始View时,它会识别出View是原始类型并对其进行特殊处理,而无需询问原始Viewbody

一个View类型是原始的,如果它的BodyNever 我怎么能确定这一点? 因为不可能返回Never类型的值。 没有这样的值,所以,如果Viewbody返回Never ,我知道 SwiftUI 不可能向那个View询问它的body ,所以 SwiftUI必须以不同于“正常” View View

例如, TextImageColor都是 SwiftUI 原语:

  1> import SwiftUI
  2> Text.Body.self
$R0: Text.Body.Type = Never
  3> Image.Body.self
$R1: Image.Body.Type = Never
  4> Color.Body.self
$R2: Color.Body.Type = Never

另一方面, Rectangle不是基元,但它的body返回一个未记录的基元:

  5> Rectangle.Body.self
$R3: Rectangle.Body.Type = _ShapeView<Rectangle, ForegroundStyle>
  6> _ShapeView<Rectangle, ForegroundStyle>.Body.self
$R4: _ShapeView<Rectangle, ForegroundStyle>.Body.Type = Never

您无法实现自己的原始View类型,因为您无权访问识别和处理原始View类型的 SwiftUI 实现细节。

一切都必须从某个地方开始。 因此,您可以从 View 开始并撰写,如

https://www.hackingwithswift.com/quick-start/swiftui/how-to-create-and-compose-custom-views

或者您可以包装一个 UIView,如

https://www.hackingwithswift.com/quick-start/swiftui/how-to-wrap-a-custom-uiview-for-swiftui

要求更低的级别就是下拉到屏幕的像素级别,根本没有框架,这是没有意义的。 您是框架的用户,而不是框架的作者

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM