J'aime étudier et apprendre la création de View sans utiliser d'héritage, par exemple pour montrer mon objectif, j'ai créé un nouveau type View appelé Color2, cela fonctionne comme prévu, mais en fait, il hérite de bien Couleur définie, donc si je veux que Color2 soit autonome et n'hérite de rien, je dois créer ou retourner body, sinon Color2 ne serait pas compilé par SwiftUI ! Cela ressemble plus à la vieille question de Qui est venu en premier, la poule ou l'œuf ?

Comment Apple a-t-il pu faire en sorte que la Color soit autonome en premier lieu ou même qu'elle existe ? le temps qu'Apple fabriquait Color View, ils devaient aussi penser au corps de Color ! Mais Apple ne fait que créer Color, ils ne pourraient même pas hériter comme je l'ai fait dans le code ! parce qu'il n'y a pas de vue couleur à hériter !!!

Donc, la question/problème est de savoir comment puis-je retourner le corps sans avoir une vue référence/définie conforme à la vue ? (Tu vois ! Je veux créer des œufs sans avoir de poulet)

Ce code bas fonctionne et ce ne sont que du pseudo-code :

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

}

0
swiftPunk 21 mars 2021 à 04:17

2 réponses

Meilleure réponse

La question/le problème est donc comment puis-je retourner le corps sans avoir une vue de référence/définie conforme à la vue ?

Tu ne peux pas.

Voici ce que vous faites, en tant qu'utilisateur de SwiftUI :

  • Vous créez des types conformes à View en implémentant la méthode body.

  • Vous créez des instances de types conformes à View et les transmettez à des fonctions ou les retournez à partir de fonctions.

Voici ce que vous ne faites pas :

  • Vous ne demandez pas à un View son body.

Le framework SwiftUI demande à un View son body. Vous ne le faites jamais.

L'astuce est que SwiftUI ne demande pas toujours à un View son body.

SwiftUI connaît certains types View spécifiques « primitifs ». Lorsque SwiftUI a besoin de rendre (ou de mettre en page) une primitive View, il reconnaît que View est un type primitif et le gère spécialement, sans demander à la primitive View pour son body.

Un type View est primitif si son Body est Never. Comment puis-je en être sûr ? Car il est impossible de renvoyer une valeur de type Never ! Il n'y a pas de telles valeurs. Donc, si le body d'un View renvoie Never, je sais que SwiftUI ne peut pas demander à View son body, donc SwiftUI doit traiter ce View différemment d'un View "normal".

Par exemple, Text, Image et Color sont toutes des primitives 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

En revanche, Rectangle n'est pas une primitive, mais son body renvoie une primitive non documentée :

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

Vous ne pouvez pas implémenter votre propre type primitif View car vous n'avez pas accès aux détails d'implémentation de SwiftUI qui reconnaissent et gèrent les types primitifs View.

2
rob mayoff 21 mars 2021 à 05:08

Tout doit commencer quelque part. Vous pouvez donc soit commencer avec une vue et composer, comme dans

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

Ou vous pouvez envelopper un UIView, comme dans

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

Demander un niveau inférieur reviendrait à descendre au niveau des pixels de l'écran sans aucun cadre, et cela n'a aucun sens. Vous êtes l'utilisateur d'un framework, pas l'auteur d'un framework.

1
matt 21 mars 2021 à 02:35