- 基本 Objective-C
- Objective-C - 主页
- Objective-C - 概述
- Objective-C - 环境设置
- Objective-C - 程序结构
- Objective-C - 基本语法
- Objective-C - 数据类型
- Objective-C - 变量
- Objective-C - 常量
- Objective-C - 运算符
- Objective-C - 循环
- Objective-C - 决策
- Objective-C - 函数
- Objective-C - 块
- Objective-C - 数字
- Objective-C - 数组
- Objective-C - 指针
- Objective-C - 字符串
- Objective-C - 结构
- Objective-C - 预处理器
- Objective-C - Typedef
- Objective-C - 类型转换
- Objective-C - 日志处理
- Objective-C - 错误处理
- 命令行参数
- 高级 Objective-C
- Objective-C - 类和对象
- Objective-C - 继承
- Objective-C - 多态性
- Objective-C - 数据封装
- Objective-C - 类别
- Objective-C - 摆姿势
- Objective-C - 扩展
- Objective-C - 协议
- Objective-C - 动态绑定
- Objective-C - 复合对象
- Obj-C - 基础框架
- Objective-C - 快速枚举
- Obj-C - 内存管理
- Objective-C 有用资源
- Objective-C - 快速指南
- Objective-C - 有用的资源
- Objective-C - 讨论
Objective-C 结构
Objective-C 数组允许您定义可以保存多个相同类型数据项的变量类型,但结构是 Objective-C 编程中可用的另一种用户定义数据类型,它允许您组合不同类型的数据项。
结构用于表示记录,假设您想跟踪图书馆中的书籍。您可能想要跟踪每本书的以下属性 -
- 标题
- 作者
- 主题
- 图书编号
定义结构
要定义结构,必须使用struct语句。struct 语句定义了一种新的数据类型,为您的程序提供了多个成员。struct 语句的格式如下所示 -
struct [structure tag] { member definition; member definition; ... member definition; } [one or more structure variables];
结构体标签是可选的,每个成员定义都是普通的变量定义,如int i;或浮动 f;或任何其他有效的变量定义。在结构定义的末尾,最后一个分号之前,您可以指定一个或多个结构变量,但它是可选的。这是声明 Book 结构的方式 -
struct Books { NSString *title; NSString *author; NSString *subject; int book_id; } book;
访问结构成员
要访问结构体的任何成员,我们使用成员访问运算符 (.)。成员访问运算符被编码为结构变量名称和我们希望访问的结构成员之间的句点。您可以使用struct关键字来定义结构类型的变量。以下是解释结构用法的示例 -
#import <Foundation/Foundation.h> struct Books { NSString *title; NSString *author; NSString *subject; int book_id; }; int main() { struct Books Book1; /* Declare Book1 of type Book */ struct Books Book2; /* Declare Book2 of type Book */ /* book 1 specification */ Book1.title = @"Objective-C Programming"; Book1.author = @"Nuha Ali"; Book1.subject = @"Objective-C Programming Tutorial"; Book1.book_id = 6495407; /* book 2 specification */ Book2.title = @"Telecom Billing"; Book2.author = @"Zara Ali"; Book2.subject = @"Telecom Billing Tutorial"; Book2.book_id = 6495700; /* print Book1 info */ NSLog(@"Book 1 title : %@\n", Book1.title); NSLog(@"Book 1 author : %@\n", Book1.author); NSLog(@"Book 1 subject : %@\n", Book1.subject); NSLog(@"Book 1 book_id : %d\n", Book1.book_id); /* print Book2 info */ NSLog(@"Book 2 title : %@\n", Book2.title); NSLog(@"Book 2 author : %@\n", Book2.author); NSLog(@"Book 2 subject : %@\n", Book2.subject); NSLog(@"Book 2 book_id : %d\n", Book2.book_id); return 0; }
当上面的代码被编译并执行时,它会产生以下结果 -
2013-09-14 04:20:07.947 demo[20591] Book 1 title : Objective-C Programming 2013-09-14 04:20:07.947 demo[20591] Book 1 author : Nuha Ali 2013-09-14 04:20:07.947 demo[20591] Book 1 subject : Objective-C Programming Tutorial 2013-09-14 04:20:07.947 demo[20591] Book 1 book_id : 6495407 2013-09-14 04:20:07.947 demo[20591] Book 2 title : Telecom Billing 2013-09-14 04:20:07.947 demo[20591] Book 2 author : Zara Ali 2013-09-14 04:20:07.947 demo[20591] Book 2 subject : Telecom Billing Tutorial 2013-09-14 04:20:07.947 demo[20591] Book 2 book_id : 6495700
结构体作为函数参数
您可以将结构作为函数参数传递,其方式与传递任何其他变量或指针非常相似。您可以按照与上例中访问类似的方式访问结构变量 -
#import <Foundation/Foundation.h> struct Books { NSString *title; NSString *author; NSString *subject; int book_id; }; @interface SampleClass:NSObject /* function declaration */ - (void) printBook:( struct Books) book ; @end @implementation SampleClass - (void) printBook:( struct Books) book { NSLog(@"Book title : %@\n", book.title); NSLog(@"Book author : %@\n", book.author); NSLog(@"Book subject : %@\n", book.subject); NSLog(@"Book book_id : %d\n", book.book_id); } @end int main() { struct Books Book1; /* Declare Book1 of type Book */ struct Books Book2; /* Declare Book2 of type Book */ /* book 1 specification */ Book1.title = @"Objective-C Programming"; Book1.author = @"Nuha Ali"; Book1.subject = @"Objective-C Programming Tutorial"; Book1.book_id = 6495407; /* book 2 specification */ Book2.title = @"Telecom Billing"; Book2.author = @"Zara Ali"; Book2.subject = @"Telecom Billing Tutorial"; Book2.book_id = 6495700; SampleClass *sampleClass = [[SampleClass alloc]init]; /* print Book1 info */ [sampleClass printBook: Book1]; /* Print Book2 info */ [sampleClass printBook: Book2]; return 0; }
当上面的代码被编译并执行时,它会产生以下结果 -
2013-09-14 04:34:45.725 demo[8060] Book title : Objective-C Programming 2013-09-14 04:34:45.725 demo[8060] Book author : Nuha Ali 2013-09-14 04:34:45.725 demo[8060] Book subject : Objective-C Programming Tutorial 2013-09-14 04:34:45.725 demo[8060] Book book_id : 6495407 2013-09-14 04:34:45.725 demo[8060] Book title : Telecom Billing 2013-09-14 04:34:45.725 demo[8060] Book author : Zara Ali 2013-09-14 04:34:45.725 demo[8060] Book subject : Telecom Billing Tutorial 2013-09-14 04:34:45.725 demo[8060] Book book_id : 6495700
结构体指针
您可以以与定义指向任何其他变量的指针非常相似的方式定义指向结构的指针,如下所示 -
struct Books *struct_pointer;
现在,您可以将结构体变量的地址存储在上面定义的指针变量中。要查找结构体变量的地址,请将 & 运算符放在结构体名称之前,如下所示 -
struct_pointer = &Book1;
要使用指向该结构的指针访问该结构的成员,必须使用 -> 运算符,如下所示 -
struct_pointer->title;
让我们使用结构体指针重写上面的示例,希望这对您来说很容易理解这个概念 -
#import <Foundation/Foundation.h> struct Books { NSString *title; NSString *author; NSString *subject; int book_id; }; @interface SampleClass:NSObject /* function declaration */ - (void) printBook:( struct Books *) book ; @end @implementation SampleClass - (void) printBook:( struct Books *) book { NSLog(@"Book title : %@\n", book->title); NSLog(@"Book author : %@\n", book->author); NSLog(@"Book subject : %@\n", book->subject); NSLog(@"Book book_id : %d\n", book->book_id); } @end int main() { struct Books Book1; /* Declare Book1 of type Book */ struct Books Book2; /* Declare Book2 of type Book */ /* book 1 specification */ Book1.title = @"Objective-C Programming"; Book1.author = @"Nuha Ali"; Book1.subject = @"Objective-C Programming Tutorial"; Book1.book_id = 6495407; /* book 2 specification */ Book2.title = @"Telecom Billing"; Book2.author = @"Zara Ali"; Book2.subject = @"Telecom Billing Tutorial"; Book2.book_id = 6495700; SampleClass *sampleClass = [[SampleClass alloc]init]; /* print Book1 info by passing address of Book1 */ [sampleClass printBook:&Book1]; /* print Book2 info by passing address of Book2 */ [sampleClass printBook:&Book2]; return 0; }
当上面的代码被编译并执行时,它会产生以下结果 -
2013-09-14 04:38:13.942 demo[20745] Book title : Objective-C Programming 2013-09-14 04:38:13.942 demo[20745] Book author : Nuha Ali 2013-09-14 04:38:13.942 demo[20745] Book subject : Objective-C Programming Tutorial 2013-09-14 04:38:13.942 demo[20745] Book book_id : 6495407 2013-09-14 04:38:13.942 demo[20745] Book title : Telecom Billing 2013-09-14 04:38:13.942 demo[20745] Book author : Zara Ali 2013-09-14 04:38:13.942 demo[20745] Book subject : Telecom Billing Tutorial 2013-09-14 04:38:13.942 demo[20745] Book book_id : 6495700
位字段
位字段允许将数据打包在结构中。当内存或数据存储非常宝贵时,这尤其有用。典型例子 -
将多个对象打包到一个机器字中。例如,可以压缩 1 位标志。
读取外部文件格式——可以读入非标准文件格式。例如9位整数。
Objective-C 允许我们在结构定义中通过在变量后面放置 :bit length 来做到这一点。例如 -
struct packed_struct { unsigned int f1:1; unsigned int f2:1; unsigned int f3:1; unsigned int f4:1; unsigned int type:4; unsigned int my_int:9; } pack;
这里,packed_struct 包含 6 个成员:四个 1 位标志 f1..f3、一个 4 位类型和一个 9 位 my_int。
Objective-C 自动尽可能紧凑地打包上述位域,前提是该域的最大长度小于或等于计算机的整数字长。如果情况并非如此,则某些编译器可能允许字段的内存重叠,而其他编译器会将下一个字段存储在下一个字中。