Tag: struct

Swift中值类型和引用类型之间的区别

介绍: 因此,对于每个新手迅速的程序员来说,了解值类型和引用类型之间的主要区别很重要。 在本文中,我们将讨论有关值类型和引用类型的主要区别。应选择的示例以及定义的时间。 在深入研究之前,我们需要了解一些基本定义,例如.. 类型:类型是数据的分类,告诉编译器或解释器如何使用数据。 有一些Swift基本类型: Int, Float ,Double,Bool,String,Array 定义: 值类型 :值类型是直接在内存上创建的类型。每个实例保留唯一的数据副本。在分配或复制时,它会创建一个完整的新数据。 引用类型 :共享单个数据的类型。 初始化一次并分配给变量,触点或函数后,其返回引用。 示例照片: 让我们用类做一些代码: 现在,如果我们将dadCar的值更改为将发生的事情,那么这就是主要问题! 为什么要改变妈妈的颜色: 当我们通过分配momCar实例使dadCor常量时,它仅返回对dadCar的引用,而未创建momCar的完整新副本。由于swift类是引用类型,因此仍引用单个实例。 像这样 : 还要注意的另一件事是dadCar是常量(let),但是我们可以为其分配值,因为引用类型实例是可变的。我们正在为dadCar分配值,并且正在更改其引用的值而不是本身。默认情况下,引用为nil。 与Struct相同的代码: 主要区别: 值类型和引用类型之间的主要区别在于,值类型复制数据,而引用类型共享其数据的单个副本。当我们创建具有值类型的实例时,值类型的均值不变,它创建数据的唯一副本,并且它可以t可以更改,但引用类型是可变的,其值可以更改.. 使用值类型时: 将实例数据与==进行比较很有意义 您希望副本具有独立状态 数据将在多个线程的代码中使用。因此,您不必担心数据会从另一个线程更改。 使用引用类型时: 将实例身份与===进行比较比较有意义 您要创建共享的可变状态 如何存储在内存中: 在普通类型系统中: 1.Value Type —获取存储在堆栈存储器中。 2 。 引用类型 —获取存储在托管堆内存中 使用值类型的优点: 1.效率 引用类型实例是在堆上分配的,这比堆栈分配要贵。 为了确保在不再需要引用类型实例时释放已分配的内存,需要保留对每个引用类型实例的所有活动引用的计数,并在没有更多引用引用时对其进行释放。 值类型不受此开销的影响,从而可以有效地创建和复制实例。 值类型的副本被认为是便宜的,因为值类型实例可以在恒定时间内被复制。 Swift将内置的可扩展数据结构(例如String,Array,Dictionary等)实现为值类型。 但是,由于它们的大小在编译时未知,因此无法在堆栈上分配它们。 为了能够有效地使用堆分配并维护值语义,Swift使用了一种称为copy-on-write的优化技术。 这意味着,虽然每个复制的实例在逻辑上都是一个副本,但是仅当复制的实例发生突变时才在堆上进行实际复制。 在此之前,所有逻辑副本将继续指向同一基础实例。 这提供了更好的性能特征,因为制作的副本较少,并且在进行复制时,它涉及固定数量的引用计数操作。 如果需要,此性能优化还可用于自定义值类型。 […]

了解Swift中的Struct

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

Swift中的Class vs Struct

类和结构是通用的灵活结构,它们成为程序代码的构建块。 您可以使用与常量,变量和函数完全相同的语法来定义属性和方法,以向类和结构添加功能。 -Apple Documentaion 让我们通过类比来讨论两者。 名词: 公司常务董事决定增加库存以应对通胀。 他命令部门人员以我提供的模板协作创建当前库存报告。 工作人员创建模板的副本并在其中共享,以便任何人都可以对其进行更新。 审核后,最终报告文档将与主管共享[具有只读访问权限]。 让我们讨论以上对话: 已共享模板以创建报告。 这意味着工作人员只能对模板具有只读访问权限。 如果Director提供了写访问权限,则任何人都可以有意或无意地更新模板,这是不期望的。 现在,要创建报告,工作人员需要制作一个模板副本并在部门之间共享,以便所有部门都可以做出贡献,并且默认情况下将保留修订历史记录。 结构 ==只读访问模板 类 ==部门人员对复制模板的读写访问权限[新文档] 相似之处: 定义属性以存储值 定义提供功能的方法 定义下标以使用下标语法提供对它们的值的访问 定义初始值设定项以设置其初始状态 扩展以扩展其功能,超出默认实现 符合协议以提供某种标准功能 相对于struct的类的附加功能: 继承使一个类可以继承另一个类的特征。 类型转换使您可以在运行时检查和解释类实例的类型。 使用反初始化程序,类的实例可以释放其分配的所有资源。 引用计数允许对一个类实例进行多个引用。 在代码中传递结构时,总是将其复制,并且不使用引用计数。 类和结构这两个主题都很广泛。 我将帖子分为两部分,以详细介绍这两个方面: 第1部分-Swift中的结构 第2部分-Swift中的课程 参考文献: 为什么选择结构而不是课堂 类和结构 https://medium.com/swift-in-sil/var-vs-let-in-sil-6476ccccfa02 谢谢阅读。 您可以随时通过Linkedin或Twitter与我联系

我在NSUserDefaults结构NSMutableArray错了吗? “尝试插入非属性列表对象”

我很简单地试图保存在NSUserDefaults的struct s的NSMutableArray / NSArray : typedef struct { int key; } provision; provision p1; p1.key = 4; NSValue *p1Value = [NSValue value:&p1 withObjCType:@encode(provision)]; provision p2; p2.key = 5; NSValue *p2Value = [NSValue value:&p2 withObjCType:@encode(provision)]; NSMutableArray *provisions = [[NSMutableArray alloc] init]; [provisions addObject:p1Value]; [provisions addObject:p2Value]; [[NSUserDefaults standardUserDefaults] setObject:provisions forKey:@"Provisions"]; 我按照这里的指南 ,把所有的结构存储为NSValue 。 但是最后一行会导致运行时错误: *由于未捕获的exception'NSInvalidArgumentException',原因:'* – [NSUserDefaults […]

如何在Objective-c中将结构保存到NSUserDefaults?

如何将自定义struct保存到NSUserDefaults ? struct Paging { NSInteger currentPage; NSInteger totalResults; NSInteger resultsPerPage; }; typedef struct Paging Paging; NSUserDefaults *userInfo = [NSUserDefaults standardUserDefaults]; [userInfo setStruct:paging forKey:@"paging"]; [userInfo synchronize]; 上面的代码会产生运行时警告: *** -[NSUserDefaults setObject:forKey:]: Attempt to insert non-property value…