Swift 值类型和引用类型
类型 引用 swift
2023-09-27 14:28:18 时间
原文地址:https://developer.apple.com/swift/blog/?id=10
Swift中的类型分为两类:一,值类型(value types),每个值类型的实例都拥有各自唯一的数据,通常它们是结构体,枚举或元组;二,引用类型(reference types),引用类型的实例共享它们的数据,通常是一个类。
原文地址:https://www.cnblogs.com/luoxiaofu/p/8528383.html 关于“值类型嵌套引用类型”的内存地址情况,我自己实验的结果与作者不同:
这些内容是每一种编程语言的基础。我们大部分人从C语言开始编程,如果你还记得通过值调用与引用调用的函数,你也许就清楚它们的区别到底是什么。
iOS 仿支付宝银行卡界面(支持Swift/OC) 在有支付相关的APP中,都有对应的钱包,虽然现在的支付宝,微信支付很流行,但是都是需要绑定自己的银行卡,那么这个银行卡的卡包页面该怎么实现呢?在网上找了许久也没有找到合适的,那就索性自己造轮子。
zhangao0086 做过后端(J2EE),11年转 iOS ,12年中~14年中创过业(跨界开火锅店..),对代码有洁癖,致力于写出优雅的代码,在多个公司负责过 iOS 架构,熟悉设计模式,热衷产品设计与交互,业余时间担任 CSDN iOS 版块版主
原文地址:https://developer.apple.com/swift/blog/?id=10
Swift中的类型分为两类:一,值类型(value types),每个值类型的实例都拥有各自唯一的数据,通常它们是结构体,枚举或元组;二,引用类型(reference types),引用类型的实例共享它们的数据,通常是一个类。在这篇文章中我们将会探索值类型和引用类型的价值,以及如何在它们二者间抉择。
// 值类型例子 struct S { var data: Int = -1 } var a = S() var b = a // 把a复制给b a.data = 42 // a被改变了, b却没有 println("\(a.data), \(b.data)") // prints "42, -1"复制一个引用类型的时候,其实是隐式地创建了一个共享的实例。在复制后,两个实例指向了同一块数据,所以当修改其中一个实例数据的时候,另一个实例的数据也被修改了,比如:
// 引用类型的例子 class C { var data: Int = -1 } var x = C() var y = x // x被复制给了y x.data = 42 // x指向的数据被修改了 (同时y也被修改了) println("\(x.data), \(y.data)") // prints "42, 42"可变性在安全中的作用 选择值类型而不是引用类型的一个主要原因是能让你的代码变得更加简单。你在任何情况下用一个值类型,都能够假设你的其他代码不会使它改变,这通常在多线程环境中很有用,如果一个线程中使用的数据被另一个线程给意外的修改了,这通常会产生非常严重的Bug,且相当难以调试。 由于只有当你需要修改数据时两者的区别才会得到体现,所以当你的实例不会对数据进行修改的时候,值类型和引用类型看起来是完全相同的。 你也许会想,写一个完全不可变的类,这或许是有价值的,使用Cocoa的NSObject能简化这个过程,并且能很好地保持原有的语义。现在,你能通过使用不可变的存储属性,以及避免暴露修改数据的接口,从而在Swift里实现一个不可变的类。事实上,大多数的Cocoa类,比如NSURL等,都被设计为不可变的类,然而,Swift当前并没有提供任何语言机制去强制申明一个类不可改变(比如子类化就能修改一个类的实现),只有结构体和枚举才是强制不可变的。 如何选择? 所以如果你想要创建一个新的类型,你怎么选择?当你写Cocoa程序的时候,大多数APIs都需要从NSObject继承,你就已经是一个类了(引用类型),针对其他情况,这里有些指导规则: 使用值类型,当...: 通过使用==去比较实例的数据 你想得到一个实例的独立副本 数据在多线程环境下被修改 使用引用类型(比如使用一个类),当...: 通过使用===去判断两个实例是否恒等 你想要创建一个共享的,可变的对象 在Swift里,Array、String和Dictionary都是值类型,他们的行为和C语言中的int类似,每个实例都有自己的数据,你不需要额外做任何事情,比如做一个显式的copy,防止其他代码在你不知情的情况下修改等,更重要的是,你能安全地在线程间传递它,而不需要使用同步技术。在提高安全性的精神下,这个模型将帮助你在Swift中写出更多可预知的代码。
原文地址:https://www.cnblogs.com/luoxiaofu/p/8528383.html 关于“值类型嵌套引用类型”的内存地址情况,我自己实验的结果与作者不同:
这些内容是每一种编程语言的基础。我们大部分人从C语言开始编程,如果你还记得通过值调用与引用调用的函数,你也许就清楚它们的区别到底是什么。
iOS 仿支付宝银行卡界面(支持Swift/OC) 在有支付相关的APP中,都有对应的钱包,虽然现在的支付宝,微信支付很流行,但是都是需要绑定自己的银行卡,那么这个银行卡的卡包页面该怎么实现呢?在网上找了许久也没有找到合适的,那就索性自己造轮子。
zhangao0086 做过后端(J2EE),11年转 iOS ,12年中~14年中创过业(跨界开火锅店..),对代码有洁癖,致力于写出优雅的代码,在多个公司负责过 iOS 架构,熟悉设计模式,热衷产品设计与交互,业余时间担任 CSDN iOS 版块版主
相关文章
- 创建了对嵌入的互操作程序集间接引用,无法嵌入互操作类型
- 值类型和引用类型在栈和堆中的分配
- [SQL]当输入表达式得数为一个有效的整数、浮点数、money 或 decimal 类型,那么 ISNUMERIC 返回 1;否则返回 0
- 【转】HashMap集合中key只能为引用数据类型,不能为基本类型
- C#【基础篇】数组(引用类型)作为值参数
- 《Hack与HHVM权威指南》——2.5 重温未决的类型
- .NET的堆和栈02,值类型和引用类型参数传递以及内存分配
- error CS0234: 命名空间“XXX”中不存在类型或命名空间名称“UserInfoVm”(是否缺少程序集引用?)
- ES6新特性:Javascript中Set和WeakSet类型的数据结构
- 《JavaScript面向对象精要》——1.3 引用类型
- 复合类型、类型约束、添加功能、高阶函数
- 拷贝构造函数的参数为什么必须使用引用类型?拷贝赋值运算符的参数为什么也是引用类型?
- js中值的基本类型与引用类型,以及对象引用,对象的浅拷贝与深拷贝
- INS/GPS组合导航类型简介
- scala编程第19章学习笔记(1)——类型参数化
- JavaScript的原生引用类型
- 值类型与引用类型(下)
- JS的基础类型与引用类型
- JavaScript引用类型之Array数组的排序方法
- C# 判断类型间能否隐式或强制类型转换,以及开放泛型类型转换 update
- 【C#】List列表的深复制,引用类型深复制