当前位置: 首页 > 知识库问答 >
问题:

为什么SwiftUI的视图协议使用PAT?

太叔豪
2023-03-14

视图协议定义如下:

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现在是一个过时的协议,不能直接用作返回类型,尽管swift5.1的不透明返回类型可以处理这个问题,但是为什么要声明一个associatedtype主体:View,而不是var主体:View{get}

共有2个答案

秦学林
2023-03-14

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

"协议只能用作通用约束,因为它有Self或关联类型要求。"

这是什么意思?

>

每当我们调用that函数时,它总是返回不同的具体类型,而不是相同的具体类型。

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

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

不透明返回类型:

  1. 它与泛型类型相反
唐俊英
2023-03-14

因为如果它只是一个变量body:Self。Body{get}-实现视图协议的实体将不知道Body的类型。

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

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

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

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

 类似资料:
  • 我正在使用下面的代码对JDK1.7进行测试 null 这个参数在哪里生效,因为我可以调用来设置我以后需要的协议?

  • 问题内容: 这是什么在StackOverflow上经常讨论的问题,这意味着什么: 这样的好处是,如果通过HTTPS访问它,则会自动获得HTTPS,而不是那种可怕的“此页面上的不安全元素”警告。 但是,为什么要完全使用相对协议的URL?为什么不直接在CDN URL中始终使用HTTPS?毕竟,如果您决定通过HTTPS加载HTTP页面的某些部分,则没有理由抱怨。 (这是专门针对CDN的;几乎所有CDN都

  • 本文向大家介绍Dubbo推荐用什么协议?相关面试题,主要包含被问及Dubbo推荐用什么协议?时的应答技巧和注意事项,需要的朋友参考一下 默认使用dubbo协议  

  • 主要内容:1 什么是HTTP协议,2 HTTP协议的特征,3 Web应用架构1 什么是HTTP协议 超文本传输​​协议(HTTP)是分布式,协作式超媒体信息系统的应用程序级协议。自1990年以来,HTTP就是互联网(即Internet)数据通信的基础。HTTP是一种通用的无状态协议。 HTTP是基于TCP/IP的通信协议,用于在万维网上传递数据(HTML文件,图像文件,查询结果等)。默认端口是TCP:80,当然也可以使用其他端口。它为计算机相互通信提供了一种标准化的方式。

  • 本文向大家介绍什么是icmp协议,它的作用是什么?相关面试题,主要包含被问及什么是icmp协议,它的作用是什么?时的应答技巧和注意事项,需要的朋友参考一下 考察点:ICMP协议   它是TCP/IP协议族的一个子协议,用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。

  • 问题内容: 苹果的新框架似乎使用了一种 新型语法 ,可以有效地构建元组,但又具有另一种语法: 尝试解决这种语法的实际含义时 ,我发现这里使用的初始化程序将类型的闭包 作为第二个参数,其中的通用参数是通过闭包推断的。为了找出要推断的类型,我对代码进行了一些更改,并保持其功能: 以此,表明自己是类型,即类型。向上看,我发现它是一个源自自身的包装器类型,只能通过传递应该包装的元组来进行初始化。 题 现在