簡體   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