Как типы представления, такие как Text или Image, соответствуют протоколу View в SwiftUI? - PullRequest
4 голосов
/ 06 июня 2019

Есть одна большая вещь, которая смущает меня о типах представлений в SwiftUI :

Кажется, они не соответствуют протоколу View, но каким-то образом они загадочным образом это делают.

Взять, к примеру, тип Text. Это определяется следующим образом:

public struct Text : Equatable { ... }

Я не могу найти общедоступное расширение, которое добавляет соответствие протоколу View, например

extension Text: View { ... }

и раздел Отношения в официальной документации просто гласят:

Соответствует: Приравнивается

Ничего больше, вот и все.

Тем не менее, я могу вернуть экземпляр Text, где требуется некоторое View, например:

var body: some View {
    Text("I'm a View, I swear!") 
}

Если Text не соответствует View, это будет невозможно, и выдается ошибка компилятора.

(some View - непрозрачный тип результата , что означает, что это определенный тип с идентификатором, но соответствующий View.)

Так как это возможно?

Где указано соответствие протокола View для типов просмотра SwiftUI (например, Text, Image, Circle, ...)?

Ответы [ 2 ]

1 голос
/ 06 июня 2019

Как вы знаете, есть 2 типа представлений ..

  1. Примитивное представление: Text, Image, Circle и т. Д.
  2. Представление контейнера: List, HStack, VStack и т. Д.

Тем не менее, ниже приведено расширение для Text, для Body задано значение Never, что означает, что ему нельзя иметь тело, поскольку оно является примитивным представлением.это предназначено для завершения цикла тела.

Итак, согласно моему пониманию, во время выполнения SwiftUI помещает Text в представление контейнера, когда обнаруживает, что примитивное представление не находится внутри представления контейнера.

@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *)
extension Text {

    /// The type of view representing the body of this view.
    ///
    /// When you create a custom view, Swift infers this type from your
    /// implementation of the required `body` property.
    public typealias Body = Never
}
0 голосов
/ 06 июня 2019

Типы представлений SwiftUI соответствуют протоколу View, в противном случае, как вы упоминали, код не будет компилироваться. Я нашел некоторые из них, которые были доступны в общедоступных расширениях SwiftUI:

Тип

Image имеет расширение, которое напрямую соответствует View:

extension Image : View {
}

Circle соответствует Shape, что само по себе соответствует View:

public struct Circle : Shape {
  ...
}

public protocol Shape : Equatable, Animatable, View {
  ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...