Objective—C语言的新魅力——Nullability、泛型集合与类型延拓(一)

简介: Objective—C语言的新魅力——Nullability、泛型集合与类型延拓

Objective—C语言的新魅力


一、引言


       在Xcode7中,iOS9的SDK已经全面兼容了Objective-C的一些新特性和新功能。这些功能都只作用于编译期,对程序的运行并没有影响,因此,它可以很好的向下进行兼容,无缝的衔接低版本的iOS系统,那么这些特性有什么样的用处呢,作为开发者,我保证你一定会爱上他们,如果你可以将这些新特性都应用于你的开发,你的开发效率和代码质量,相比之前,会有一个很大的提升。


二、Nullability检测的支持


       在swift语言中,通过!和?可以将对象声明成Optional,用于在开发中标记这个对象是否可以为空。在OC中,以前是没有这样的功能的,因此我们在开发中会经常遇到因为某个函数应该返回实例而返回了空导致的崩溃。Nullability的主要用武之地,就是在这里,它可以起到提示开发者做是否为空得判断的提示。


       打开Xcode7,系统的框架中已经支持了Nullability,如下:


@property (nullable, nonatomic, readonly) ObjectType firstObject;

@property (nullable, nonatomic, readonly) ObjectType lastObject;

这是NSArray中的两个属性,其中nullable关键字说明了这里可能返回空的值。


如果仅仅是在返回值中给开发者一些提示,你可能觉得应用并不大,是的,对开发者最大的帮助是这一特性可以用于函数的参数中,这样我们在调用函数时起到的提示作用,将是非常重要的,越是多人合作的项目,作用也越大。


例如:


-(void)setValue:(NSNumber * _Nonnull )number{

 

}

我们在调用函数时,如果传入了空值,编译器会给我们警告:




注意:


这一特性在Xcode6.3中就已经支持,但在Xcode7中又做了一些写法上的小改动,例如,在Xcode6.3中这样写:


-(void)setValue:( nonnull NSNumber *  )number{

 

}

而在Xcode7中提倡我们使用第一种写法。


与之相关的几个关键字如下:


修饰参数


nonnull:不可为空


nullable: 可以为空


null_unspecified:不确定是否可以为空(极少情况)


在属性的声明中,还会有如下一个修饰符:


null_resettable:set方法可以为nil,get方法不可返回nil


一点提示:


你可以发现,iOS9的SDK中已经完全兼容使用了这些特性,并且nonnull的使用会比nullable广泛的多,因此,系统提供了这样一对宏:



#define NS_ASSUME_NONNULL_BEGIN _Pragma("clang assume_nonnull begin")


#define NS_ASSUME_NONNULL_END   _Pragma("clang assume_nonnull end")


我们在这对宏之间定义的变量都会加上nonnull的修饰符,只有我们特殊声明nullable的才需要手动写。


三、泛型集合的支持


       这一特性和Nullability一样,只作用于编译期,是为我们开发者服务的另一重要特性。还记得,在Xcode7之前,依然是为了方便多人开发,我经常会在框架中写这样的一个空得宏:


image.png


在开发时如下使用,做到提示伙伴我这个数组中是什么东西的作用:


@interface ViewController ()

{

   NSArray __TYPE__FIT_TO__CLASS(NSString) *  array;

}

@end

当然,所有这些都是我自己的自导自演,编译器并不会鸟我,我在这个数组中加其他的东西,它也不会介意,所有这些只是我和我的伙伴们约定的一种一厢情愿。所以,当我看到Xcode7中的集合类型时,我着实兴奋了一下。


1、有类型约定的集合


       在Xcode7中,我们可以给集合类型添加一个泛型的约定,如下:


NSMutableArray<NSString *> *array = [[NSMutableArray alloc]init];

声明了这样一个数组后,就好比我告诉了编译器,这个数组中的数据类型都是NSString*类型的,现在非常好,如果我这个数组中元素的方法,会出现如下的提示:

image.png



激动吧,使用点语法可以访问到数组中泛型的方法了,还有更加诱人的:


image.png


在我们向这个数组中追加元素的时候,编译器将元素的类型提示了出来,并且将FromArray方法中需要的元素类型也提示了出来。


同样,如果我们向这个数组中追加类型不匹配的元素,如下:


   NSMutableArray<NSString *> *array = [[NSMutableArray alloc]init];

   [array addObject:@1];

编译器会给我们一个这样的警告:

image.png

目录
相关文章
|
存储 算法 C语言
用C语言开发游戏的实践过程,包括选择游戏类型、设计游戏框架、实现图形界面、游戏逻辑、调整游戏难度、添加音效音乐、性能优化、测试调试等内容
本文探讨了用C语言开发游戏的实践过程,包括选择游戏类型、设计游戏框架、实现图形界面、游戏逻辑、调整游戏难度、添加音效音乐、性能优化、测试调试等内容,旨在为开发者提供全面的指导和灵感。
651 2
|
存储 编译器 C语言
C语言:数组名作为类型、作为地址、对数组名取地址的区别
在C语言中,数组名可以作为类型、地址和取地址使用。数组名本身代表数组的首地址,作为地址时可以直接使用;作为类型时,用于声明指针或函数参数;取地址时,使用取地址符 (&),得到的是整个数组的地址,类型为指向该类型的指针。
1296 4
|
C语言 C++
【C语言】指针篇-一篇搞定不同类型指针变量-必读指南(3/5)
【C语言】指针篇-一篇搞定不同类型指针变量-必读指南(3/5)
214 1
|
存储 缓存 程序员
c语言的存储类型-存储类
本文详细介绍了C语言中的存储类型及其分类,包括基本类型(如整型、浮点型)和复合类型(如数组、结构体)。重点讲解了不同存储类别(`auto`、`static`、`register`、`extern`、`typedef`、`volatile`、`const`)的特点及应用场景,并展示了C11/C99引入的新关键字(如`_Alignas`、`_Atomic`等)。通过示例代码解释了每个存储类别的具体用法,帮助读者更好地理解和运用这些概念。
|
C语言
【c语言】qsort函数及泛型冒泡排序的模拟实现
本文介绍了C语言中的`qsort`函数及其背后的回调函数概念。`qsort`函数用于对任意类型的数据进行排序,其核心在于通过函数指针调用用户自定义的比较函数。文章还详细讲解了如何实现一个泛型冒泡排序,包括比较函数、交换函数和排序函数的编写,并展示了完整的代码示例。最后,通过实际运行验证了排序的正确性,展示了泛型编程的优势。
203 0
|
存储 自然语言处理 编译器
C语言中的char类型
C语言中的char类型
3877 1
|
算法 编译器 API
C语言中的longdouble类型
C语言中的longdouble类型
434 1
|
存储 编译器 C语言
C语言学习记录——数据的存储(数据类型、类型的基本归类、整型在内存中的存储、大小端介绍、浮点型在内存中的存储)一
C语言学习记录——数据的存储(数据类型、类型的基本归类、整型在内存中的存储、大小端介绍、浮点型在内存中的存储)一
276 2
|
算法 程序员 编译器
探索C语言的魅力与实用性
本文介绍了C语言在信息爆炸时代的重要性,因其高效、灵活和强可移植性而广泛应用。C语言由Dennis Ritchie于1972年创建,特点是结构化、高效、跨平台和灵活。它常用于系统软件、嵌入式系统、游戏开发和图形界面应用的开发。文中通过一个简单的加法函数示例展示了C语言的基本语法,并强调了学习C语言对于理解计算机底层原理和提升编程技能的价值。

热门文章

最新文章