![iOS开发:从零基础到精通](https://wfqqreader-1252317822.image.myqcloud.com/cover/796/26793796/b_26793796.jpg)
6.5 结构
6.5.1 结构的定义与基本使用
Objective-C中除了类之外,还定义了结构(struct)用来存储变量。在一些场景下,类和结构是可以通用的。假如希望存储日期,包含年、月、日3个变量,那么可以考虑定义一个Date类,其中包含3个int类型的属性,分别存储year、month和day。另外,也可以使用结构来定义一个新的数据类型。
1.结构类型的定义
当程序员希望定义一个结构时,可以使用如下形式。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T169_19884.jpg?sign=1739539975-EIc05M0IFeHo6FBkbd7IENnVzqUwCwzf-0-eeedf02ea466007459a571d9cd31d6b6)
例如,可以定义一个名称为Date的结构体来存储日期。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T169_82869.jpg?sign=1739539975-AqC7oyPDay6y45fP8775625lq8myKE45-0-cce6180965bec207b6595c325c519a8c)
2.结构变量的声明
声明一个结构体变量,会在内存中分配空间,等待给成员变量赋值。声明结构体变量的方式为:
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T169_19888.jpg?sign=1739539975-j4i3cMD1vzCZcvC4JTV4BVnLIXFczN1E-0-656d7f1fce89a12f4387f5ace07c044a)
例如,声明一个名为today的结构体变量,类型为Date,此时会分配内存空间,用来存储日、月、年3个变量。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T169_19890.jpg?sign=1739539975-OZY9pkJeH0gt0ttyZAWq3OcPqupTYBu2-0-4272700ddd1aedc72f506a695f3a77ce)
3.结构变量的赋值/初始化
对象属性的赋值可以使用点语法,也可以使用KVC。结构变量的初始化以及赋值则可以采用如下两种方式。
- 使用点语法赋值。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T169_82870.jpg?sign=1739539975-Z8j7btdf07tPbtLYyGMmTLQs7H3rGpOT-0-d9f42a2d7280cb2ac85b609bb0be1176)
- 在定义结构体变量时,也可以在一个大括号中,按照顺序对变量依次赋值,变量之间使用逗号分割。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T169_19894.jpg?sign=1739539975-CgsQ7UdNzuVKaHR6gU90J4YUcnt2UH9B-0-3b3986f2f3f47c4dbf9f5ece045a9e0c)
4.结构成员变量的访问
当需要访问结构体成员变量时,通常情况下,可以使用点语法来获取结构中成员变量的值。在下方的示例代码中,完整地演示了结构体的定义、声明、初始化以及成员变量的访问过程。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T170_82871.jpg?sign=1739539975-9n2XoipAhNDr5c6mZHSi7JySuJCsulxi-0-cd4dac9748fa0127bf03d545cb55985f)
运行结果如图6-24所示。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-P170_20039.jpg?sign=1739539975-NiHfdirrcDF8GuQ3NrzfgoXUysNa2NX9-0-d3eb16b6adcb9e0bc70eb85fc6ae2560)
图6-24 运行结果
6.5.2 结构的嵌套
在Objective-C的语法中,结构的定义可以十分灵活。例如,可以定义一个结构,其中还包含其他的结构作为成员变量。除此之外,还可以定义包含数组的结构。
1.嵌套结构的定义
在学习UIView类时,可以了解到任何一个控件在设备上的布局,都是由其frame属性所决定的,而frame属性则是一个CGRect类型的结构体,其中还包含了两个结构成员,分别为原点坐标以及长宽,类型为CGSize和CGPoint,而CGSize和CGPoint也是结构。
- CGRect结构的构成如下。由另外两个结构体CGSize和CGPoint组成。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T170_20044.jpg?sign=1739539975-BmPkCnBKmF0UMfxaoDixREqKh0tID8La-0-296972a5857b47eaa264e2ba099ff151)
- CGPoint结构的构成如下,包括两个CGFloat类型的变量构成。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T171_20180.jpg?sign=1739539975-FPR5wCz8xk0V4TFp1XMa8tFGWA5W1XLi-0-b6af98984f9be416a3aac4f69bd82577)
- CGSize结构的构成如下,包括两个CGFloat类型的变量构成。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T171_20182.jpg?sign=1739539975-U2LsyDiR4pmKDVGjDVzvV7YrOnQh1QIJ-0-a8d8850610c81703023abf0a23e18932)
2.嵌套结构的初始化
对于嵌套结构的初始化,通常情况下可以先初始化其中的子结构成员变量,然后再初始化外层的结构。
- 通用初始化方法。当需要定义嵌套结构变量时,可以先分别定义其中的结构体成员,代码如下所示。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T171_20184.jpg?sign=1739539975-DMhYQdrMGmf0qTvsSALL6VPCI8cI0gbs-0-60e81da1ef05f2b71ec052ac477666c4)
- 快速初始化方法。在系统提供的框架中,有时会提供一些函数,来供开发者快速创建结构体成员变量。例如,在系统中提供了CGRectMake()函数,可以通过该函数直接创建CGRect结构类型的变量。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T171_20186.jpg?sign=1739539975-U1c3WsIlkBI8sqiT3C0WnwyPKoguNHNC-0-35072383f8f4a34d579e67edbdaeb27f)
3.嵌套结构成员变量的访问
嵌套结构成员变量的访问可以通过多级点语法的方式访问。下方的示例代码中,完整地演示了嵌套结构变量的创建、修改以及成员变量访问方法。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T171_20188.jpg?sign=1739539975-QJqxe0enZfLN4lA8dCHS0iJmvFtuXGPD-0-706aad37fd9db0877a06f10077e8e2c8)
运行结果如图6-25所示。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-P172_20288.jpg?sign=1739539975-U1D06FDFCMKZBXYfSPvZnZMmATnw9Th8-0-7bc2b295db411a0040fa6e57d3e0129d)
图6-25 运行结果