Swift-iOS中类和结构体
Posted MinggeQingchun
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Swift-iOS中类和结构体相关的知识,希望对你有一定的参考价值。
一、简介类和结构体
1、类(Class)
类(Class)是面向对象程序设计实现信息封装的基础。
类是一种用户定义类型,也称类类型。
每个类包含数据说明和一组操作数据或传递消息的函数。
类的实例称为对象。类是面向对象程序设计中的概念,是面向对象编程的基础。
类的实质是一种数据类型,类似于int、char等基本类型,不同的是它是一种复杂的数据类型。因为它的本质是类型,而不是数据,所以不存在于内存中,不能被直接操作,只有被实例化为对象时,才会变得可操作。
类是对现实生活中一类具有共同特征的事物的抽象。
类的内部封装了方法,用于操作自身的成员。类是对某种对象的定义,具有行为(be-havior),它描述一个对象能够做什么以及做的方法(method),它们是可以对这个对象进行操作的程序和过程。它包含有关对象行为方式的信息,包括它的名称、方法、属性和事件。
类的构成包括数据成员和成员函数。数据成员对应类的属性,类的数据成员也是一种数据类型,并不需要分配内存。成员函数则用于操作类的各项属性,是一个类具有的特有的操作。
2、结构体(struct)
结构体(struct)是值类型数据结构,它使得一个单一变量可以存储各种数据类型的相关数据。
二、类和结构体区别
Swift推荐在app中使用结构体(struct),类(class)在Swift中不处于主流地位。
而在OC中很少用到结构体,比较常见的如:CGPoint, CGSize 还是 CGRect 其本质都是结构体, 且它们存在着嵌套关系, CGPoint, CGSize 都是 CGRect 中的属性
相同点:
1、结构体与类的类型不一样,可是他们的基类型都是对象(object)
2、都可以将多个数据封装为一个整体
区别:
1、 在 Swift 中,类是引用类型(Reference Type),结构体是值类型(Value Type)。值类型在传递和赋值时将进行复制,而引用类型则只会使用引用对象的一个"指向"。
结构体的赋值是copy,深拷贝;类对象的赋值是地址赋值,浅拷贝
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
/*----Struct----*/
let A = Person()
let B = Person()
let tempStruct = InfoStruct()
A.tempStruct = tempStruct;
B.tempStruct = tempStruct;
A.changeStructName(name:"小张")
/*----Class----*/
let tempClass = InfoCLass()
A.tempClass = tempClass;
B.tempClass = tempClass;
A.changeClassName(name:"小明")
}
}
class Person {
var tempStruct: InfoStruct?
var tempClass: InfoCLass?
func changeStructName(name:String) {
tempStruct?.name = name
}
func changeClassName(name:String) {
tempClass?.name = name
}
}
struct InfoStruct {
var name:String = "AB"
}
class InfoCLass {
var name:String = "CD"
}
结果如下:
2、 在内存中,引用类型----如类是在堆(heap)上,而值类型----如结构体实在栈(stack)上进行存储和操作。相比于栈上的操作,堆上的操作更加复杂耗时,所以官方推荐使用结构体,这样可以提高程序运行的效率。
“堆”和“栈”的区别,为什么访问struct比class块?
“堆”和“栈”并不是数据结构上的Heap跟Stack,而是程序运行中的不同内存空间。栈是程序启动的时候,系统事先分配的,使用过程中,系统不干预;堆是用的时候才向系统申请的,用完了需要交还,这个申请和交还的过程开销相对就比较大了。
栈是编译时分配空间,而堆是动态分配(运行时分配空间),所以栈的速度快。
从两方面来考虑:
(1)分配和释放:堆在分配和释放时都要调用函数(MALLOC,FREE),比如分配时会到堆空间去寻找足够大小的空间(因为多次分配释放后会造成空洞),这些都会花费一定的时间,而栈却不需要这些。
(2)访问时间:访问堆的一个具体单元,需要两次访问内存,第一次得取得指针,第二次才是真正得数据,而栈只需访问一次。
3、 类可以被继承,而结构体不能被继续
4、 结构体只能封装属性,而类不仅可以封装属性还可以封装方法
三、使用场景
1、如果封装的不仅有数据还有方法行为,只能使用类
2、 如果表示实体,没有方法,只有属性
(1)如果属性较少,只有几个的情况下,就定义为结构体, 存放栈中, 方便调用
(2)如果属性较多,就不要定义为结构体,因为这样的结构体在栈中会占用很多空间,反而会影响效率
以上是关于Swift-iOS中类和结构体的主要内容,如果未能解决你的问题,请参考以下文章