专栏首页韦弦的偶尔分享为什么SwiftUI的视图使用结构体?

为什么SwiftUI的视图使用结构体?

如果您曾经为UIKit或AppKit(Apple的iOS和macOS原始用户界面框架)编程,您会知道它们使用类而非结构体来构造视图。SwiftUI并非如此:我们更喜欢将结构体用于整体视图,这有两个原因。

首先,有一个性能因素:结构体比类更简单,更快。我之所以说性能因素,是因为很多人认为这是SwiftUI使用结构体的主要原因,而实际上这只是更大范围的一部分。

在UIKit中,每个视图都来自一个名为UIView的类,该类具有许多属性和方法:背景色,确定其放置方式的约束,用于将其内容呈现到其中的图层等等。其中有很多,每个UIViewUIView子类都必须具有它们,因为继承是这样工作的。

struct or class

通常这不是问题,但是有一个名为UIStackView的特定子类,它类似于SwiftUI中的VStackHStack。在UIKit中,UIStackView是一种非渲染视图类型,旨在简化布局,但这意味着即使它因为继承的原因具有背景色,也​​从未真正使用过。

在SwiftUI中,我们所有的视图都是简单的结构体,几乎可以自由创建。想想看:如果您制作一个仅包含一个整数的结构体,则结构体的整个大小就是:一个整数。没有其他的。没有从父类,祖父母类或曾祖父母类等继承的多余值——它们完全包含您可以看到的内容,仅此而已。

得益于现代iPhone的强大功能,我不会慎重考虑后创建1000个整数甚至100,000个整数——眨眼之间就会发生。1000个SwiftUI视图甚至100,000个SwiftUI视图也是如此。他们是如此之快,以至于不再值得考虑。

但是,尽管性能很重要,但视图作为结构体还是有很多更重要的事情:它迫使我们考虑以一种干净的方式隔离状态。您会发现,类能够自由更改其值,这可能导致代码混乱——SwiftUI如何知道什么更改了值并需要更新UI?

通过生成不会随时间变化的视图,SwiftUI鼓励我们转向更具功能性的设计方法:在将数据转换为UI时,我们的视图变成简单的,惰性的东西,而不是会失去控制的智能化的东西。

当您查看可以作为视图的事物时,可以看到这一点。我们已经使用了Color.redLinearGradient作为视图——包含很少数据的简单类型。实际上,您不能找到比使用Color.red作为视图的更好的主意:除了“用红色填充我的空间”之外,它不包含任何信息。

相比之下,Apple的UIView文档列出了UIView拥有的约200种属性和方法,无论是否需要它们,所有这些属性和方法都将传递给其子类。

提示:如果您在视图中使用类,则可能会发现代码无法编译或在运行时崩溃。 相信我:使用结构体。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • SwiftUI:使用 @EnvironmentObject 从环境中读取自定义值

    SwiftUI的环境使我们可以使用来自外部的值,这对于读取Core Data上下文或视图的展示模式等很有用。但是我们也可以将自定义对象发送到环境中,并在以后将它...

    韦弦zhy
  • SwiftUI:集成 MapKit

    自从2007年第一台设备问世以来,地图就一直是iPhone的核心功能,开发者几乎已经可以使用底层框架了。它叫做 MapKit,和UIKit一样,如果我们不介意进...

    韦弦zhy
  • Hacking with iOS: SwiftUI Edition 视图和修饰符项目——挑战

    这个技术项目旨在深入探究特定的SwiftUI主题,我希望您在这里学到了很多有关视图和修饰符的知识——为什么SwiftUI的视图使用结构体,为什么some Vie...

    韦弦zhy
  • SQL视图

    具化式对比替换式就是在内存有一张表是表示视图,操作视图时用的就算内存的那个表而不是基表

    木瓜煲鸡脚
  • 翻译_iOS视图编程指南(View Programming Guide for iOS)之介绍

    在iOS中,你可以使用窗口和视图将你应用的内容呈现在屏幕上。窗口本身是不具备呈现可视化内容的功能的,但它可以用作装有应用视图的容器。视图可以规定在窗口的某一部分...

    Jacklin999
  • iOS视图编程指南(View Programming Guide for iOS)(译)

    Jacklin
  • SAP ABAP视图变更之全解析

    上一篇介绍视图变更方法的文章里,很多读者小伙伴给我了一些建议,非常感谢大家提供的思路和方法。所以,今天这篇文章我们在讨论一下这个问题,介绍一下另一种实现视图变更...

    matinal
  • 「mysql优化专题」视图应用竟然还可以这么优化?不得不收藏(8)

    视图包含行和列,就像一个真实的表。视图中的字段就是来自一个或多个数据库中的真实的表中的字段。视图并不在数据库中以存储的数据值集形式存在,而是存在于实际引用的数据...

    java进阶架构师
  • MySQL视图的创建与使用

    视图是MySQL的一种虚拟表,实际的表我们可以看到每一行的数据,而视图是另一种形式的表,他可以将任何的查询结果变成一种虚拟的表方便下一次进行查询。

    大猫的Java笔记
  • SwiftUI:使用 @EnvironmentObject 从环境中读取自定义值

    SwiftUI的环境使我们可以使用来自外部的值,这对于读取Core Data上下文或视图的展示模式等很有用。但是我们也可以将自定义对象发送到环境中,并在以后将它...

    韦弦zhy

扫码关注云+社区

领取腾讯云代金券