Почему протокол просмотра SwiftUI использует PAT? - PullRequest
2 голосов
/ 10 июня 2019

View протокол определяется следующим образом:

public protocol View : _View {

    /// 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.
    associatedtype Body : View

    /// Declares the content and behavior of this view.
    var body: Self.Body { get }
}

так что View теперь является протоколом PATed, который нельзя напрямую использовать в качестве возвращаемого типа, хотя непрозрачный возвращаемый тип swift 5.1 может справиться с этим, но зачем объявлять associatedtype Body : View, а не var body: View { get } напрямую

Ответы [ 2 ]

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

Потому что, если это просто var body: Self.Body { get } - ваша сущность, реализующая протокол View, не будет знать тип body.

struct MyView: View {
    var body: MyAnotherView {
        //implementation...
    }
}

Этот код не скомпилируется, и вам придется написать следующее:

struct MyView: View {
    var body: View {
        //implementation...
    }
}

И я думаю, что за кулисами SwiftUI должен знать точный тип View, а не просто протокол

0 голосов
/ 29 июня 2019

До SwiftUI Swift не позволяет нам использовать протоколы со связанными типами в качестве типов возврата, но мы можем использовать «обычные» протоколы.Компилятор позволил вам ограничиться, показав ниже ошибку:

«Протокол можно использовать только как общее ограничение, потому что он имеет требования к Self или связанные с типами».

Что это значит?

  • Компилятор не может вывести связанный тип из этого определения, и тип возвращаемого значения будет неполным.

  • Каждый раз, когда мы вызываем эту функцию, он всегда возвращает другой конкретный типесли тот же конкретный тип.

    • Компилятор не позволит вам выполнить операцию замены, сравнения, сравнения с этим конкретным типом.Даже они принимают один и тот же протокол (т.е. это PAT).Поскольку конкретный тип может иметь различный связанный тип, который они выполнили или использовали.

    Чтобы избежать использования конкретного конкретного типа в качестве возвращаемого типа при каждом вызове, мы используем some ключевое слово в качестве непрозрачного возвращаемого типа.

Непрозрачный тип возврата:

  1. Это тип, обратный универсальному типу.
  2. Он всегда возвращает один и тот же конкретный тип. Вы и компилятор это знаете.
  3. Если вместо этого мы используем непрозрачный тип результата, мы обеспечиваем, чтобы функция всегда возвращала один и тот же конкретный тип.
  4. Внутри функции при выполнении операции мы знаем универсальный тип.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...