Swift中值类型和引用类型

Swift中值类型和引用类型,第1张

概述值类型:值类型被赋予给一个变量、常量或被传递给一个函数的时候,其值会被拷贝。 引用类型:引用类型被赋予给一个变量、常量或被传递给一个函数的时候,其值不会被拷贝。引用的是已存在的实例本身而不是其拷贝。 在 Swift 中,所有的基本类型:整数(Integer)、浮点数(floating-point)、布尔值(Boolean)、字符串(string)、数组(array)和字典(dictionary),

值类型:值类型被赋予给一个变量、常量或被传递给一个函数的时候,其值会被拷贝。

引用类型:引用类型被赋予给一个变量、常量或被传递给一个函数的时候,其值不会被拷贝。引用的是已存在的实例本身而不是其拷贝。


在 Swift 中,所有的基本类型:整数(Integer)、浮点数(floating-point)、布尔值(Boolean)、字符串(string)、数组(array)和字典(dictionary),都是值类型,并且在底层都是以结构体的形式所实现。所有的结构体和枚举类型都是值类型。这意味着它们的实例,以及实例中所包含的任何值类型属性,在代码中传递的时候都会被复制。

let aPerson = Person(name: "xxx",age: 35)var bPerson = aPerson

Person是一个结构体,所以bPerson的值其实是aPerson的一个拷贝副本,而不是本身。尽管
有着相同的name和age,但是在幕后它们是两个完全不同的实例。

对bPerson做如下修改:

bPerson.age = 60
这样bPerson的age修改为了60,但是aPerson的age还是35。在将aPerson赋予给的时候,实际上是将中所存储的值进行拷贝,然后将拷贝的数据存储到新的实例中。结果就是两个完全独立的实例碰巧包含有相同的数值。由于两者相互独立,因此将age修改为60并不会影响中的的值。



类是引用类型。

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实际上引用的是相同的实例。换句话说,它们是同一个实例的两种叫法。

查看得知instanceDog的age也变为了10。



Swift 中,许多基本类型,诸如StringArrayDictionary类型均以结构体的形式实现。这意味着被赋值给新的常量或变量,或者被传入函数或方法中时,它们的值会被拷贝。

Objective-C 中NsstringNSArrayNSDictionary类型均以类的形式实现,而并非结构体。它们在被赋值或者被传入函数或方法时,不会发生值拷贝,而是传递现有实例的引用。

    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
总结

以上是内存溢出为你收集整理的Swift中值类型和引用类型全部内容,希望文章能够帮你解决Swift中值类型和引用类型所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1059366.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)