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中类和结构体的主要内容,如果未能解决你的问题,请参考以下文章

Swift-类和结构体

C++中类和结构体的区别

Swift之深入解析类和结构体的本质

Swift-类和结构体(Class and Structures)

Swift的闭包,枚举,类和结构体

swift类和结构体004-类和结构体基本使用