0

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

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

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

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

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!
 
        }
    }

}

4

2 回答 2

2

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

你不能。

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

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

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

以下是你不做的事情:

  • 你不问View它的body.

SwiftUI 框架要求一个View. body你永远不会。

诀窍是 SwiftUI 并不总是要求View它的body.

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

一个View类型是原始的,如果它BodyNever。我怎么能确定这一点?因为不可能返回 type 的值Never!没有这样的价值观。所以,如果 aView的return ,我知道bodySwiftUINever不可能要求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 实现细节。

于 2021-03-21T05:08:12.747 回答
1

一切都必须从某个地方开始。因此,您可以从 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

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

于 2021-03-21T02:35:10.170 回答