Swift中值类型和引用类型
来源:互联网 发布:linux中usermod 编辑:程序博客网 时间:2024/06/08 05:59
值类型:值类型被赋予给一个变量、常量或被传递给一个函数的时候,其值会被拷贝。
引用类型:引用类型被赋予给一个变量、常量或被传递给一个函数的时候,其值不会被拷贝。引用的是已存在的实例本身而不是其拷贝。
在 Swift 中,所有的基本类型:整数(Integer)、浮点数(floating-point)、布尔值(Boolean)、字符串(string)、数组(array)和字典(dictionary),都是值类型,并且在底层都是以结构体的形式所实现。所有的结构体和枚举类型都是值类型。这意味着它们的实例,以及实例中所包含的任何值类型属性,在代码中传递的时候都会被复制。
let aPerson = Person(name: "xxx", age: 35)var bPerson = aPerson
Person是一个结构体,所以
bPerson
的值其实是aPerson
的一个拷贝副本,而不是aPerson
本身。尽管aPerson
和bPerson
有着相同的name和age,但是在幕后它们是两个完全不同的实例。对bPerson做如下修改:
bPerson.age = 60
这样bPerson的age修改为了60,但是aPerson的age还是35。在将aPerson赋予给bPerson
的时候,实际上是将aPerson
中所存储的值进行拷贝,然后将拷贝的数据存储到新的bPerson
实例中。结果就是两个完全独立的实例碰巧包含有相同的数值。由于两者相互独立,因此将bPerson
的age
修改为60
并不会影响aPerson
中的age
的值。类是引用类型。
class Dog { var name: String? var age: Int}let instanceDog = Dog()instanceDog.name = "daHuang"instanceDog.age = 6
声明了一个名为instanceDog的常量,其引用了一个
Dog
类的新实例,然后,instanceDog
被赋予名为newInstanceDog
的新常量,同时对newInstanceDog
的age进行修改:let newInstanceDog = instanceDognewInstanceDog.age = 10
因为类是引用类型,所以instanceDog
和newInstanceDog
实际上引用的是相同的Dog
实例。换句话说,它们是同一个实例的两种叫法。查看得知instanceDog的age也变为了10。
Swift 中,许多基本类型,诸如String
,Array
和Dictionary
类型均以结构体的形式实现。这意味着被赋值给新的常量或变量,或者被传入函数或方法中时,它们的值会被拷贝。
Objective-C 中NSString
,NSArray
和NSDictionary
类型均以类的形式实现,而并非结构体。它们在被赋值或者被传入函数或方法时,不会发生值拷贝,而是传递现有实例的引用。
NSString *aString = @"this is string"; NSString *bString = aString; aString = @"this is jinping"; NSLog(@"---aString:%@", aString); NSLog(@"---bString:%@", bString); NSMutableString *aMString = [[NSMutableString alloc] initWithString:@"aaa"]; NSMutableString *bMString = aMString; [aMString insertString:@"bbb" atIndex:0]; NSLog(@"---aMString:%@", aMString); NSLog(@"---bMString:%@", bMString);
打印结果:
2017-09-03 15:59:23.671 UISkeletonStoryboard[30281:2220465] ---aString:this is jinping2017-09-03 15:59:23.671 UISkeletonStoryboard[30281:2220465] ---bString:this is string2017-09-03 15:59:23.672 UISkeletonStoryboard[30281:2220465] ---aMString:bbbaaa2017-09-03 15:59:23.672 UISkeletonStoryboard[30281:2220465] ---bMString:bbbaaa
阅读全文
0 0
- Swift中值类型和引用类型
- C#中值类型和引用类型
- C#中值类型和引用类型
- C#中值类型和引用类型
- C#中值类型和引用类型区别
- c# 中值类型和引用类型
- 理解JavaScript中值类型和引用类型
- C#中值类型和引用类型
- C#中值类型和引用类型及类型的转换
- 彻底理解C#中值类型和引用类型的区别
- C#中值类型和引用类型的分析
- C#中值类型和引用类型的区别
- 理解C#中值类型和引用类型的区别
- JAVA中值类型和引用类型的不同
- JAVA中值类型和引用类型的不同
- JAVA中值类型和引用类型的不同?
- C#中值类型和引用类型的区别
- JAVA中值类型和引用类型的不同
- 又学一招!二维向量vector<vector<int>>在VC下的使用技巧。
- Codevs 1169 传纸条
- ZooKeeper_1_分布式
- [C++] VS中出现未将对象引用设置到对象的实例
- HDOJ 连连看 (DFS (TLE))
- Swift中值类型和引用类型
- 奇货商城重构——webpack自动化工程
- 记一次RedHat中文乱码,中文语言包安装实践
- tensorflow学习——collections.namedtuple函数
- [C++] 继承与同名成员变量
- [C++] 零散知识点
- 银行卡识别OCR开发流程
- Clion this file does not belong to any project target问题解决方案
- select源码剖析