从C语言的变量声明到Objective-C中的Block语法

本文深入解析从C语言声明到Objective-C代码块的转变过程,详细讲解了声明符、代码块修饰符等核心概念,以及如何将代码块作为Objective-C方法的参数或返回值使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转载地址:http://www.cocoachina.com/ios/20160329/15789.html

原文:From C Declarators to Objective-C Blocks Syntax

作者:Nils Hayat

译者:CocoaChina--sunshine

在这篇文章中,从简单的C语言中各种声明开始,以及复杂的声明组合,到最后Objective-C中的代码块bokck的语法。

花一些时间去了解代码块(block)衍生和组织形式,一旦明白了这些,就可以很方便的声明和使用它,而不用每次需要的时候才去Google一下。

如果你想把能想到的东西用block声明表现出来,请继续阅读!

Declarators(说明符)

C语言中是通过说明符来声明变量的。

一个说明符有两个作用:

  1. 定义这个变量的类型;

  2. 给变量定义一个名字,以便在它的作用域中使用它;

让我们用一个最基本的说明符开始:?

QQ截图20160324110958.png

这很像你曾经写过的第一行C语言代码。

int 是基本的变量类型,a是变量的名字(或标示符)。

当开始看一个说明符的时候,应该从变量名(说明符)开始,先看变量名右边的部分,然后看变量名左边的部分(接下来的部分解释为什么要这么做)。

int a;中在变量名a的右边部分什么都没有,所以它直接的说明了:a是一个int类型的变量。

一个变量的声明只有一个基本类型,它就是说明符最左边的部分。

说明符能够通过修饰符去改变基本的数据类型,从而衍生出新的类型。修饰符就是下面的四种符号:*[],()^

指针修饰符( 

QQ截图20160324111032.png

类型仍旧是int,变量名是a。但是指针修饰符(*)意味着a是一个指针,指向一个int的值,而其本身不是一个int的值。

指针修饰符(*)总是在变量的左边。

数组修饰符([]

QQ截图20160324111319.png

上面的数组修饰符([])表示a是一组int,而不是一个简单int值。声明的时候要加上数组的长度,例如int a[10];

数组修饰符([])总是在变量的右边。

函数修饰符 (()

QQ截图20160324111511.png


函数修饰符表示:f是一个返回int值得函数。函数修饰符可以携带参数,例如int f(long);意味着:f是一个携带一个long型参数并且返回一个int类型值得函数。

函数修饰符()总是在变量的右边。

修饰符的组合

指针修饰符(*)和数组修饰符([])

组合

修饰符可以组合在一起从而产生复杂的变量类型。就跟算术操作符相似,算术操作符可以组合在一起,然后按照优先级的不同判断先进行的操作(就向*和/的优先级高于+/-),修饰符也如此。修饰符[]和()的优先级高于秀是否*和^.因为[]和()的优先级高,所以放在变量的右边,因此当遇到复杂的说明符时,应该从变量名(标示符)开始,先看右边的部分,在看左边的部分。

例如

QQ截图20160324111624.png

或者为了提高阅读性用括号将变量名及右边部分扩起来。

QQ截图20160324111700.png

都是表示:a是一个指针数组,数组中的每一元素都指向一个int类型的值。

可能会有人问,怎么才能声明一个指向一组int值得指针呢?下面的声明方式就可以实现:

QQ截图20160324111817.png

指针修饰符的优先级低于数组修饰符,因此要放在括号中来提高它的优先级。这样表示:a是一个指向一组int值得指针。

数组修饰符([])和函数修饰符()组合

你不能声明一个数组,数组中的每个元素是一个函数,也不能声明一个函数,该函数返回一个数组或者一个函数。但是一个函数的参数可以是一个数组。

例如?

QQ截图20160324111854.png

以上表示:f是一个函数,有一个参数,该参数是一个长度为10的数组(数组中的每个元素是一个int类型的值),函数返回一个int类型值。

指针修饰符(*)和函数修饰符()组合

QQ截图20160324111939.png

上面的两个声明都表示:f是个函数,返回一个指针,该指针指向一个int类型的值。

如过想要一个指针,指向一个函数,该什么办呢?

QQ截图20160324112015.png

上面的声明表示:f是个函数指针,该指针指向一个返回int类型值得函数。

代码块(也称闭包)修饰符(^

Apple在其proposed extension of the ANSI-C standard中引入了该修饰符。被称作代码块指针修饰符(闭包修饰符)。该修饰符跟指向指针修饰符很类似。声明一个代码块跟声明一个指针,指向一个函数的方法是相同的。

该修饰符只能用于函数,所以int ^a;是错误的。这就说明了为什么int ^b()时非法的,会引起编译器错误的。如果按照上面说的阅读说明符的方法来看该说明符,表示b是一个函数,返回值是一个代码块指针,指向一个int类型的值。这也就是问什么要将^b放在括号中的原因。

QQ截图20160324112243.png

b表示:一个代码块,指向一个返回int类型值的函数或者简写成代码块返回一个int类型的值。

你也可以在定义代码会函数的时候携带参数,例如

QQ截图20160324112319.png

表示:代码块有一个long型的参数,一个返回值,为int类型。

这就是代码块声明的由来。

为了在Objective-C中使用代码块,有一些其他的语法需要你去记住的。1.定义代码块的语法;2.如何将一个代码块传递给一个Objective-C方法。

抽象的说明符

一个抽象说明符由2部分组成:一个抽象说明符,一个变量名。

抽象的说明符在标准C语言中有3种使用场景:

1.int *a;long *b = (long *)a;(long *)就是一个抽象说明符:表示一个指向long型的指针。

2.作为sizeof()的参数:malloc(sizeof(long *));

3.作为函数的参数类型:int f(long *);

Objective-C使用抽象说明符作为方法的参数或者方法的返回值;

1
-(long *)methodWithArgument:(int *)a;

这里的(long **) 和 (int *) 都是抽象说明符。

所以为了能够把代码块作为Objective-C方法中的参数或者返回值,我们需要去找到这些代码快的抽象说明符。可以通过移除说明符中的变量名来获取;

例如:

int (^b)() 移除变量名b获取抽象说明符 int (^)() 和 int (^b)(long) 移除变量名b来获取抽象说明符 int (^)(long).

例子:

1
2
-(void)methodWithArgument:(int(^)())block;
-(void)anotherMethodWithArgument:(void(^)(long?arg1))block;

在抽象说明符中参数的名字是可以省略的。因为Xocde会自动帮你将这些完成。

Block字面量

当你编写int a = 2;时,int a是一个说明符,2是a的值,也称实现。

脱字符(^)也被用来作为一元操作符,将一个函数实现转换为代码块。你可以不用具体说明代码块的返回值,会自动从返回语句中推断得到。

因为是代码块的实现部分,需要定义参数的名字。

例如:int (^block)(long, long);实现如下所示

1
2
3
4
block=^(long a,long b){
int c =a+b;
return c;
}

总结

看起来很复杂,Objective-C中的block语法建立在标准的C语法上。Objective-C中的block就像一个指针,指向一个函数。一旦明白这些,在加上稍加联系,你会发现block很容易去掌握。


校园失物招领微信小程序源码, 失物招领小程序主要为解决大学生时常丢失物品而且很难找回以及归还过程繁琐不方便的问题, 与传统的失物招领方式不同,该款校园失误招领小程序拥有快捷发布寻物启事和失误找领功能, 快速查找、极速归还、高效沟通、防误领冒领等功能, 在开发校园失物招领小程序前与用户访谈发现有近40的同学校园内频繁丢失物品、证件、校园卡等, 数码产品、日用品等,丢失区域主要发生在教学楼、图书馆和食堂。 拾领校园失物招领小程序继承了寻物启事和失物招领,丢失物品或拾取物品都可发布帖子, 首页的横幅滚动公告展示通知公告等,banner图片化的方式更具有视觉吸引力, 最新信息可显示最近发布的招领信息或寻物信息,更加方便快捷的展示信息, 用户可通过首页的发布按钮发布帖子,发布者只需填写物品的相关信息,类别、地点等相关信息, 并且可以填写手机号开启认领验证,并可以一键生成二维码分享或分享至群聊和朋友圈。 列表内可以筛选物品类别或精确搜索,物品详情里可展示物品的相关信息, 确认是自己的物品后可点击认领,然后验证信息,需填写物品的关键信息以作辨认, 防止冒领误领,物品详情页可生成二维码海报分享,还有即时的消息联系功能以提高沟通效率, 发布者还可选择放置在代收处,双方还可以通过拨打电话紧急联系,用于紧急情况,让失物找到主人, 个人中心可以管理发布的物品帖子,管理个人信息,包括昵称、默认学校、手机号的修改、 编辑发布的物品帖子、获取帮助等。帮助用户流畅的使用该小程序。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值