为什么SwiftUI的View Protocol使用PAT?

时间:2019-06-10 00:42:27

标签: swift swiftui

In [561]: arr[:]=[np.arange(3) for i in range(5)] In [562]: arr Out[562]: array([array([0, 1, 2]), array([0, 1, 2]), array([0, 1, 2]), array([0, 1, 2]), array([0, 1, 2])], dtype=object) 协议的定义如下:

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 } } 现在是PATed协议,它不能直接用作返回类型,尽管swift 5.1的不透明返回类型可以处理此问题,但是为什么要声明View,而不是直接associatedtype Body : View

2 个答案:

答案 0 :(得分:1)

因为仅仅是var body: Self.Body { get }-实现View协议的您的实体将不知道body的类型。

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

此代码将无法编译,您必须编写以下代码:

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

我认为,在幕后,SwiftUI必须知道View的确切类型,而不仅仅是协议

答案 1 :(得分:-1)

在SwiftUI之前,Swift不允许我们将关联类型的协议用作返回类型,但是我们可以使用“常规”协议。 编译器让您通过显示以下错误来进行限制:

“由于协议具有自我或相关类型要求,因此只能用作通用约束。”

这是什么意思?

  • 编译器无法从此定义中推断关联的类型,并且返回类型将不完整。

  • 每当调用那个函数时,它总是返回不同的具体类型,而不是相同的具体类型。

    • 编译器不允许您对此具体类型执行交换,相等,比较操作。即使他们采用相同的协议(即PAT)。 因为具体类型可能具有它们实现或使用的不同关联类型。

    为避免每次调用时使用不同的具体类型作为返回类型,我们使用 some 关键字作为不透明的返回类型。

不透明返回类型:

  1. 与通用类型相反。
  2. 它总是返回相同的具体类型。您和编译器都知道。
  3. 如果我们改用不透明的结果类型,则我们强制该函数将始终返回相同的具体类型。
  4. 执行操作时的内部函数我们知道泛型。