iOS Swift5:浅析结构体(struct)与类(class

2021-02-26  本文已影响0人  青叶小小

一、前言

关于 struct 与 class,相信大家或多或少有些了解,本篇的目的是让大家完全透彻的熟悉,不在是片面了解。

二、基础

2.1、起源

大家学过 C 语言,也应该学过 C++,先帮大家从底层先梳理一下基础知识:

我们不谈 C 语言,因为它没有 class,struct 也功能单一。

2.2、C++ 中两者的区别

C++ 中 struct 与 class 的区别:

2.2.1、继承

关于继承,可能大家都忘记了『基类与子类在继承时,属性的限制』:

public、protected、private 指定继承方式
不同的继承方式会影响基类成员在派生类中的访问权限。

  1. public继承方式
    基类中所有 public 成员在派生类中为 public 属性;
    基类中所有 protected 成员在派生类中为 protected 属性;
    基类中所有 private 成员在派生类中不能使用。

  2. protected继承方式
    基类中的所有 public 成员在派生类中为 protected 属性;
    基类中的所有 protected 成员在派生类中为 protected 属性;
    基类中的所有 private 成员在派生类中不能使用。

  3. private继承方式
    基类中的所有 public 成员在派生类中均为 private 属性;
    基类中的所有 protected 成员在派生类中均为 private 属性;
    基类中的所有 private 成员在派生类中不能使用。

综上,我们可以得出结论:

我们用图来方便大家记忆:

inherience.png

2.2.2、模板(template)

说起模板可能大家有点生疏,但我换个词大家就能理解:函数重载!

何谓函数重载?
函数重载针对的是形参(即入参),可以有多个同名函数,但只要满足以下条件中的一个就行:

  1. 函数的参数个数不同;
  2. 函数的参数类型不同;
  3. 函数的不同参数类型顺序不同;

例如我有如下方法:

//交换 int 变量的值
void swap(int *a, int *b){
    int temp = *a;
    *a = *b;
    *b = temp;
}

//交换 float 变量的值
void swap(float *a, float *b){
    float temp = *a;
    *a = *b;
    *b = temp;
}

如果用模板来实现如下:

template<typename T> void Swap(T *a, T *b){
    T temp = *a;
    *a = *b;
    *b = temp;
}

template是声明模板关键字,typename是声明类型关键字(Java中泛型);

2.3、类型区别

最简单的理解:

三、Swift 中的两者浅析

无论是 OC 还是 Swift,它们的底层都是 C++,所以,struct 与 class 在 C++ 层面的特性是不会发生变化的,我们主要讨论的是两者在 Swift 层面的相同点与不同点。

3.1、相同点

3.2、不同点

以上主要是针对 class 来说的,struct 是没有这些的。

四、总结

Swift 之所有增加了 struct,主要有以下几点考虑:


关于速度话题的延伸:

从两方面来考虑:

关于速度,这里有一个早期 stackoverflow 的帖子:
http://stackoverflow.com/a/24243626/596821

速度的测试用例(Github):
https://github.com/knguyen2708/StructVsClassPerformance


苹果官方也给出了两者如何选择使用:
https://developer.apple.com/documentation/swift/choosing_between_structures_and_classes

说白了就是:

上一篇下一篇

猜你喜欢

热点阅读