1. 从零开始:理解Objective-C的语法基石
如果你刚开始接触iOS或macOS开发,面对Objective-C可能会觉得它有点“古老”和“啰嗦”。别担心,这种感觉很正常。我刚开始学的时候,也觉得那些方括号和长长的消息发送语法有点奇怪。但用久了你会发现,Objective-C的这套语法体系,尤其是它的基本类型、集合和代码块,组合起来其实非常强大和优雅。今天,我就想和你聊聊,怎么把这些看似独立的语法点,像搭积木一样串联起来,形成一套高效的编码模式。
Objective-C是C语言的超集,这意味着它完全兼容C。所以,你首先会遇到的就是那些C语言里的基本类型,比如int、float、char。但Objective-C作为一门面向对象的语言,它又引入了一些自己特有的、或者说是更适合应用开发的基本类型。比如,我们不用true和false,而是用YES和NO来表示布尔值。这不仅仅是关键字的不同,它背后是signed char类型,这种设计有它的历史原因,也提醒我们注意类型安全。
更常用的是NSInteger和NSUInteger。你可能会问,为什么不用int和unsigned int呢?这里就体现了Objective-C的一个核心思想:平台无关性。NSInteger在32位系统上是int,在64位系统上是long。苹果帮你处理好了这些底层细节,你只需要用NSInteger,就能保证你的整数在任何苹果设备上都有正确的长度,避免了一些潜在的溢出和精度问题。CGFloat也是同样的道理,它是为Core Graphics框架服务的浮点数,在64位系统上对应double,32位上对应float。
但光有这些基本类型,在面向对象的世界里是不够的。对象才能拥有方法,才能被放入集合。这就引出了我们的第一个“粘合剂”:NSNumber。它是一个类,一个对象,它的唯一工作就是把int、float、BOOL甚至char这些基本类型“包装”起来,变成一个可以传递、可以存储的对象。你可以用字面量语法@42来快速创建一个包含整数42的NSNumber对象,这比老式的[NSNumber numberWithInt:42]要简洁太多了。NSNumber是我们连接基本世界和对象世界的桥梁,没有它,我们后面要讲的集合类就寸步难行。
2. 数据的容器:灵活运用集合类
当我们有了数据(无论是基本类型包装成的NSNumber,还是字符串NSString,或是自定义的对象),下一步自然就是要把它们组织起来。Objective-C提供了三大集合类:数组(NSArray)、字典(NSDictionary)和集合(NSSet)。它们各有各的脾气,用对了地方,代码会清晰又高效。
2.1 有序的列表:NSArray
数组大概是使用频率最高的集合了。它保持元素的顺序,并且允许重复。创建数组我强烈推荐使用字面量语法@[...],比如@[@"张三", @25, @YES],一眼就能看出里面有什么,比用一堆arrayWithObjects:方法要直观得多。访问元素就用下标array[0],和C语言数组很像,非常自然。
数组的遍历有很多种方式。最常用的是快速枚举(Fast Enumeration):for (id obj in array) { ... },写起来快,读起来也清晰。但有时候你需要索引,这时候可以用带block的enumerateObjectsUsingBlock:方法。这个方法强大之处在于,它把当前对象、索引、还有一个是否停止的指针都传给你。你可以在循环体里根据索引做判断,也可以随时设置*stop = YES来跳出循环,这在查找特定元素时非常有用。
NSArray是不可变的,一旦创建就不能增删改。这听起来是限制,其实是优势,它保证了线程安全。当你需要一个可变的数组时,就用它的子类NSMutableArray。添加用addObject:,插入用insertObject:atIndex:,删除用removeObject:。我个人的习惯是,在内部处理数据时用NSMutableArray,但当数据确定下来,要传递给其他方法或返回时,我会返回一个不可变的NSArray副本,这样可以避免数据被意外修改。
2.2 键值对映射:NSDictionary
字典存储的是键值对(Key-Value Pair),通过唯一的键(通常是NSString)来快速查找对应的值。它的字面量语法是@{ key: value, ... },比如创建一个用户信息字典:@{@"name": @"李四", @"age": @30, @"city": @"上海"}。取值就用dict[@"name"],非常直观


304

被折叠的 条评论
为什么被折叠?



