Tag: 结构

了解Swift中的Struct

让我们快速深入了解struct struct是一种值类型 ,当将其值分配给变量或常量或将其传递给函数时,其值将被复制 。 结构必须在创建结构实例时将所有存储的属性都设置为初始值。 您可以在初始化程序中或通过分配默认值来为存储的属性设置初始值。 让我们为ecommerse网站的产品创建一个结构。 当我们复制struct时,它复制所有值类型,但它共享引用类型的引用。 如果您在上面的对象图中看到,ProductA和productB之间共享ProductFactory 结构类型的成员初始化器 所有结构都有一个自动生成的成员初始化器,您可以使用该初始化器来初始化新结构实例的成员属性。 可以通过如下名称将新实例的属性的初始值传递给成员初始化程序: 产品(标识号:1234,名称:“ Remote car”,库存:true) 产品又有一个工厂。 由于我们已经在声明时初始化了此属性,因此无需传入initializer 。 可选属性类型 可选类型的属性会自动初始化为nil值。 关于写时复制的不错的文章 内存分配: 结构将始终在堆栈中为所有值类型分配内存。 堆栈是一个简单的数据结构,具有两个操作,即Push和Pop 。 您可以通过按住指向堆栈末尾的指针来推动堆栈末尾并弹出堆栈末尾。 所有引用类型都将存储在堆中。 堆使您可以分配具有动态生命周期的内存。 它必须搜索未使用的内存块进行分配,然后重新插入内存块以进行重新分配。 因此,如果结构具有引用类型,它将具有指向该类型的指针。 结论: 我试图在此处添加有关结构值类型的所有信息,这对于我们作为开发人员来说是必需的。

Swift中Struct和Class之间的区别。

3.初始化方法。 不管是Class还是Struct,如果我们希望在创建实体的时候,可以顺便带入初始值,则Struct其中不需自行编写init方法,当我们去做呼叫的时候,即会呼叫来做初始化属性的动作。 而Class则没有这个功能,所以如果我们希望做到带入初始值,我们必须自行撰写一个init的方式,并且在其中将自身的属性分配给带入的初始值。 这个时候你可能会问,那struct里面可不可以用到init()方法? 答案是可以的,个人觉得会在结构里面再写一次init方式的时候,多半都是为了要去定义外部参数名称(外部参数名称)的时候,才会用到。 这边我顺便插播播一个东西 最初来说,您不能在值类型所定义的方法中去修改其本身所带的属性,例如:struct,enum。因此如果要做这样的修改,就必须在func前面加上mutating,这个关键字的意思就是告诉compiler,我允许这个功能去修改本身自带的特性,在功能运行完之后,本身自带的特性也会跟着改变啦! 大概以上几个的差异,如果还是很容易搞混的话,建议大家可以开一个操场,实际的去体会看看其中的相对~~但是总归一个大方向,构造保存较简单的资料,而类别则是用来储存较复杂的资料与操作这些资料! 以上内容跟大家分享,如果有任何疑问欢迎留言! 图片来自google搜索,如果有犯罪疑虑请来信告知,谢谢!

类或结构-这是问题吗?

众所周知,设计应用程序中最重要的步骤是DataModel的定义。 这个阶段需要大量关注和长时间,因为这是我们项目的逻辑,核心,在此阶段做出的决定可能会影响我们代码的速度,可持续性和可重用性。 我记得对于与我的队友Giacomo和Jippe一起进行的最新Apple iOS开发人员学院项目,我们花了3个多星期才发布第一版。 当您开始设计它时,情况似乎并没有那么糟。 关键时刻到了,您必须创建第一个对象。 这就是两难的原因: 类还是结构? 可以在网上找到成千上万的文章。 每个人都通过重复通常的概念以及类和结构之间的通常差异来作出响应,而没有根据我们的需要解释何时使用一种而不是另一种有用。 答案总是相同的,并且倾向于强调两者之间的差异,它们并不能真正帮助我们选择对我们的案例最有用的一个 例如: 1.继承 类具有继承。 结构没有。 因此,如果需要对结构进行子类化,唯一的解决方案是将其转换为类。 2.价值和参考语义 类使用语义参考。 当等距分配给变量或函数时,它们指的是同一现有实例。 例如: 如您所见,创建新变量并不意味着创建新对象。 通过视图所做的更改也可以从view2中看到,因为它们引用了内存中的同一对象。 关于不可变性的观察: 如您所见, view和view2都被声明为let,因此它们都是constant 。 但是,为什么可以在类中更改值而不用编译器抱怨呢? 类是引用类型,因此可以暗示在程序执行期间,所指向的存储区域(即地址)不变。 您可以使用var和let控制类中的可变属性和不可变属性。 结构使用值语义。 当将值类型的对象分配给变量或传递给函数时,编译器将复制该对象。 实际上,只要不修改对象,它们就与同一对象相关。 发生更改时,编译器将进行复制。 这种技术称为写时复制。 例如: 在发生更改之前,string1和string2是相同的实体 编辑string2,强制编译器创建原始对象的副本。 关于不可变性的观察: 尝试将string2从var更改为let 。 您会注意到编译器会抱怨,因为您已将结构声明为常量 ,并且试图更改其内部状态。 它们的行为不像类。 结构具有语义值,如果声明为let,则不能更改结构中的任何属性。 对于声明为var的结构,您可以在初始化后更改,将所有内部属性定义为var。 但是……这些解释可以帮助我们解决难题吗? 没有! 我认为,所有这些答案都无法阐明选择为特定实体创建类或结构所引起的疑问。 很多时候,我开始考虑这种选择似乎天天琐事。 终于,我找到了解决这个难题的办法! 平等的概念 那些了解我的人都非常清楚,我喜欢通过使用现实生活中的示例来解释概念,然后将其与实际的示例进行比较。 每当我们遇到这种选择, 类或结构时 ,请问自己: […]

Swift中的Struct vs Class

在处理数据或自定义数据类型时,每个人有时都会遇到这个问题。 因此,我深入研究了Google和许多网站,并指出了一些我想分享给大家参考的差异。 在此之前,我先说一下两者的相似之处: 结构和类都可以: 扩展 实施协议 定义初始化 具有属性和功能 您可以在这里简要阅读所有这些内容 区别 继承 : 类可以相互继承,但结构不能 2. 通过 : 类通过Reference传递,但结构通过Value传递。 因此,我们将类称为“引用类型”,将结构称为“值类型” 3. 可变性 : 如果结构是不可变的,则这些类是Mutable的。 例如,如果我们有用let属性声明的class实例,如let a:A()。 作为类内部变量的属性可以更改这些变量的值。 4. 参考计数 : 由于是引用类型,所以Class的单​​个实例可以一次具有多个引用,从而使其具有引用计数。 但是结构不是这种情况。 结构实例一次仅具有一个引用。 5. 初始化器 结构不需要声明任何初始化程序,因为默认情况下它们是可用的,尽管可以根据需要编写该初始化程序。 这些类需要声明init以将值初始化为属性。 6. 反初始化器 类确实具有deinit,而在结构中不存在。 7. 线程安全: 默认情况下,结构是线程安全的,因为它们是值类型,所以不会有覆盖相同实例的机会,因此不会有任何竞争条件。 这些类不是唯一的线程安全类,因为它们是引用类型。 何时使用结构和类: 我在这里找到Irina Ernst的最佳答案 “结构最适合保存数据,而不是逻辑。”

如何处理值类型的递归

在我们的应用程序中,当我们需要共享状态时,我们可以使用引用类型。 例如,视图,视图控制器和模型控制器需要是引用类型。 但是,我们应用的模型必须是值类型,以便我们可以传递本地副本。 否则,您可能会遇到更改模型状态的问题,并在应用程序的其他位置产生副作用。 因为您的模型类型也是传递最多的模型类型,所以当它们是引用类型时,可能会对内存管理产生更大的影响。 Swift的问题在于,由于存在内存管理问题,它不允许使用递归值类型。 值类型分配在堆栈上,而不分配在堆上。 它们的大小必须固定,因为操作系统需要知道将它们放入堆栈的大小。 将它们放在堆栈上之后,它们的大小将无法增长,因为其他数据将被置于它们之上。 如果结构包含自身,则系统无法计算其大小。 这就是为什么Swift不允许递归值类型,并且您不能编写这样的代码的原因: 结构TypeA { 让其他:TypeA } 或这个: 结构TypeA { 让其他:B型 } 结构B型{ 让其他:TypeA } 有两种解决此问题的方法: 集合提供足够的间接性以允许递归引用 只有一个参考时使用协议 假设我们有两个结构。 一个用于用户 ,一个用于博客 。 User结构具有一个属性,该属性包含该用户的所有已发布博客,该属性包含该用户的所有关注者,以及一个属性lastBlog(用于最近发布的博客)。 Blog结构具有此Blog作者的属性,类型为User 。 我们可以通过为其中一个用户创建协议来解决User结构的LatestBlog属性和Blog结构的author属性的递归引用问题。 在我们的Blog结构中。 属性博客和User结构的关注者的收集类型提供了足够的间接方式来规避此问题: struct用户{ 命名:字符串 var博客:[Blog] var个关注者:[User] var LatestBlog:BlogType? } 协议 BlogType {} struct Blog:BlogType { 让日期:日期 让内容:字符串 让作者:用户 }

我应该使用struct还是class?

如果您不熟悉Swift,那么您可能会认为Struct和Class可以做完全相同的事情,而struct的灵活性也较低,因此为什么不使用Class而不是Class呢? 结构是值类型, 类是引用类型。 引用类型位于堆内存中,值类型位于堆栈存储器中。 因此有时struct可能比类更快,但实际上它取决于许多其他事情。 包含值类型的变量包含整个值类型值。 当您将值类型复制到另一个变量时,这意味着您正在复制整个值。 复制后,它们是两个不同的变量,如果您对一个变量进行了一些更改,则不会对另一个变量产生影响。 包含引用类型的变量包含一个指针,该指针保存实际变量所在的内存地址。 将引用类型复制到另一个变量意味着它将地址从一个变量复制到另一个。 这两个变量现在拥有相同的内存地址。 如果对其中一个进行一些更改,则对另一个也会有相同的效果。 如果我们通过Struct和Class,那么我们可以得出如下摘要: 课程– 可以支持继承。 正在配套铸件。 可以有反初始化器。 支持引用计数。 结构- 不支持继承。 不支持类型转换。 通过价值传递。 不能有空引用。 因此,结构基本上适合用作数据容器,而不是逻辑部分。 如果您的数据类型相对较小且寿命较短,则可以考虑使用结构。

开始进行Swift编程第6部分-结构,类,属性和方法

在上一篇文章中,我们介绍了函数,枚举和范围。 开始Swift编程第5部分-函数,枚举和作用域 在上一篇文章中,我们介绍了if语句,while循环和for-in循环(通常仅称为for循环)。 medium.com 它使我们对如何使用函数分解代码,使用枚举创建选项(并修复很长的if / else-if语句)的方式以及如何使内存使用率保持在较低水平并通过覆盖范围来查找讨厌的bug有了很好的理解。 。 今天,我们将讨论两个新对象,它们也是类型,它们也是容器,可帮助进一步分离代码并使代码更具可读性。 不要把代码分开得越多,就越容易阅读,这是一种快乐的媒介。 类和结构有助于建立这种媒介。 因此,让我们直接讨论一下Structs。 结构 C中的结构(如结构)是包含相似变量的数据类型,在Swift中,我们扩展了此功能,以允许结构也包含函数,枚举和其他结构,并且声明如下: 我们使用struct House声明一个结构,然后在主体中放入我们认为合适的任意数量的变量,常量或其他结构。 如果需要更改变量,请使用var声明它;如果不行,请使用let使其成为常量。 当我写出变量时,我会考虑应该测量或确定什么,然后通常以let开头并键入变量名称。 我问自己几个关于此变量应为哪种类型的问题。 这里只是几个问题: 使用浮点数(双精度/浮点数)有意义吗? 使用整数(Int)是否有意义? 是否确定状态(布尔值/枚举)? 它可以衡量或确定(结构)的多种因素吗? 问自己这样的问题将帮助您弄清楚要与特定变量一起使用的类型。 squareFootage可以用整数来度量,但也可以包含十进制数,因此我们将其默认为Double类型。 我们永远不能拥有一半的房间或四分之一的房间,因此numberOfRooms变成一个Int,与numberOfWindows相同。 您为什么认为我将numberOfBathrooms为Float。 我们永远不会有四分之一的浴室。 我们可以有一个完整的浴室,哦,等等,我们可以有一个半卫生间,其中只有一个水槽和一个厕所,或者一个水槽和一个浴缸。 因此,我们可以将1.5个半澡返回1.5 。 好的,那很有道理。 然后我们将address作为字符串常量。 为什么恒定? 好吧,如果您更改地址的时间为99.99999…%,那是因为您搬到了另一所房子,而这所房子不再适用于您,因此我认为将其设为常数是安全的。 然后我们有var doorIsOpen 。 好的,因此可以在两个可能的值之间切换,因此我们将其设为布尔值变量。 当然,我们可以在该结构中添加一个Garage ,因为我们都知道一个车库可以容纳这么多的汽车,因此我们可以说numberOfCars并将其numberOfCars Int 。 我们的车库可能有也可能没有窗户,因此我们允许设置窗户,但可以选择使用numberOfWindows: Int? 。 最后,如果我们要拉出车库或停在车库中,我们需要知道门是打开还是关闭。 我们使用doorIsOpen做到这doorIsOpen 。 呃,鲍勃…我们已经有了一个名为doorIsOpen的变量,它是基本House结构的一部分。 是的,我们这样做,但是由于范围的doorIsOpen , Garage结构中的doorIsOpen变量与House结构中的doorIsOpen变量不同。 让我们看看如何使用此结构来创建房屋。 […]

Penggunaan数据模型和结构pada Swift

Swift merupakan salah satu bahasa pemrograman yang mendukung pemakaian数据模型。 Kali ini saya akan membuatnya menggunakan struktur数据yang didapat dari API developer.marvel.com。 Mengapa harus menggunakan数据模型和结构? 恕我直言,bisa saja sebuah aplikasi dibuat tanpa menggunakan数据模型和结构,dimana masih menggunakan字符串状态。 Tapi tentu hal ini阿肯语menyulitkan untuk dokumentasi aplikasi tersebut和banyak kemungkinan untuk terjadi 错字 。 Bisa Juga Membuat Frustasi开发人员Yang Baru Akan Mulai Mengembangkan Aplikasi Tersebut。 […]