Objective-C的初学者指导part2:Methods

来源:互联网 发布:中国海洋大学网络缴费 编辑:程序博客网 时间:2024/05/14 20:35

原文章地址:http://blog.teamtreehouse.com/the-beginners-guide-to-objective-c-methods
原文章标题:The Beginner’s Guide to Objective-C 作者:Ben Jakuben
参与翻译: Dawn.L
最近在学iOS后来看到了这个系列的文章,感觉挺有帮助,希望分享给大家!
PS.受水平和时间限制(每天空闲时间极少..),部分翻译可能不是很恰当,希望大家指正!

编写一个iPhone或iPad的杀手应用程序不会让你成为Obejct-C语言的主宰,反而你写的程序越友好,你会越享受!编写自己的应用程序(app)起初看起来貌似是道无法逾越的鸿沟,但是如果你从学习编程语言是如何工作的开始,一步一步来,你就能用这些内容去创造复杂和惊奇的东西.

想要熟练运用Objective-C编程语言,你需要经常练习敲代码.但是如果没有事先了解了一些知识,你就别想深入这门语言,这就是我们为什么在Treehouse(原文网站)!这是我们谈论Objective-C语言基础和如何使用它来写iOS程序系列的第二个部分.在之前的文章,我们谈及了语言自身和去理解变量.在这篇文章,我们将会聚焦一个重要的基础,那就是”方法(methods)”.

这里写图片描述

代码注释

首先,让我们先了解一下对于编程语言来说最有用的特征:注释! 一个好的注释相当于1000行代码的价值,用代码自身来记录代码会给我们带来难以置信的帮助,我们基本上会留下一些笔记给我们自己或其他开发人员去解释代码的作用.我们在Objective-C和其他的编程语言中使用注释.Objective-C注释代码是程序运行时不会执行的代码行.它们就是单纯的提供信息,帮助我们理解代码的功能和结构.

单行注释

单行注释由两个正斜杠开始 : //. 这两个正斜杠后面的内容组成了注释,而且这些内容会被程序忽略(运行时不执行).

// 这是一个单行注释NSString *badWord = @"Android"; // 仅仅这部分(正斜杠之后)是注释内容

多行注释

有时候我们想写很长的注释,而且不想只写在一行上.这种情况下我们就使用注释开始标记符: /*, 和注释结束标记符 */.来把注释包含其中.

/* 这是一个多行注释. 虽然仅仅需要开始和结束标记符就可以完成注释, * 我们通常在中间的行数的开头加上星号来增加可读性 * 结束标记符号在新的一行 */

方法(Method) 消息(Message) 和函数(Function)

(下文中原作者将method, message这两个词交替使用,翻译时都进行了相对应的翻译).

“方法”,”消息”,和”函数”这些术语都提到了Objective-C中的相同的东西.你可能听说过他们的使用方式是可交换地,虽然有很多的不同. 一个方法(或 消息 或 函数)是我们能从其他地方调用到我们代码中的代码的一部分.然后”方法”就会做出一些行为或者返回一些我们可以使用的结果.我们使用”方法”去把我们的代码组成可重复利用的(简单易懂的)部分,这样就可以节省我们大量的时间和精力.

让我们为这个概念插入一个例子.NSString 类有一个名字为length 的方法,这个方法可以返回给我们字符串的长度.这个例子的定义代码看起来就像下面这样:

01  - (int)length {02    int numberOfCharacters = 0;03    // ... 计算字符串长度的代码 ...04    return numberOfCharacters;05  }

第一行声明了名字为length 的方法.最前面的那个字符是一个破折号”-”. 在Objective-C中,方法的定义都是由一个破折号(-)或一个加号(+)开始的. 当我们谈到类和对象的时候(part3),我们会谈论更多细节, 这个破折号意味着这个方法是一个”实例方法”,实例方法只能由包含此方法的类的实例来访问.加号则表示此方法是一个”类方法”,类方法可以在任何时间被类的引用访问.

在我们上面的例子中,我们就需要通过 实际字符串(NSString的实例)去引用length 方法,这样的调用过程能够讲得通,因为我们确实想知道这些真实的字符串的长度.类方法(带加号的)将会在其他情况中使用.举个例子,比如当我们第一次创建一个
NSString 实例变量的时候.

在破折号或加号的后面,我们可以看到一队圆括号,而且里面还有一个重要的单词. 这个单词就是这个方法的返回值类型.换句话说,这个单词指定了通过这个方法,什么类型的数据会被返回.在上面这个例子中,我们像让它返回int 类型的数据,因为长度就是一个简单的数字.

一些方法会做一些事情但是不会返回任何数据.在这些情况下,我们使用一个特殊的关键字,”void”,来表示此方法不会返回任何数据:(void). 如果我们想让它返回一个string类型的,我们就把“NSString * ”放到圆括号里面: (NSString *). (还记得我们在part1里面说过,星号表示一个指针吗?因此我们实际上返回了指向内存中存放strings的地方的指针.)

接下来我们知道了方法的名字,在刚才的例子中方法的名字是”length”.加上我们有一对花括号包括住多行的代码,就组成了方法.如果一个方法返回数据(意思就是 返回类型不是 (void)),然后方法的最后一行必须包含return 关键字,紧接着后面跟着要返回的数据. return 关键字结束了方法的执行,因此任何在这个关键字后面写的代码将不会被执行.

调用方法 (也被称作 发送消息)

这里写图片描述

我们已经定义过了一个简单的方法.那么怎么使用它呢?它会为我们带来什么好处呢?

01  NSString *emailAddress = @"ben@objectivecfun.com"02  int stringLength = [emailAddress length];03  // stringLength will equal 21!

这个例子展示了方法是如何使用的,这里我们呼叫了emailAddress 变量的length 消息,精确地说就是,给emailAddress 对象发送了length 消息.

Method(方法)和Message(消息)之间的简单解释

Objective-C是基于消息发送模型(有点像调用方法)再加上其他的好内容构成的.本质上,发送消息和很多其他编程语言中的调用方法是一样的,这就是为什么它们的使用是可交换的.当不同的消息发送给不同的对象时,传递的消息是不同的.取决于对讲是否能够处理消息.如果一个对象不能处理消息,那么什么坏事也不会发生,它只会返回空值(nil)给发送者(呼叫者).这样就比方法模式更困难,因为如果一个被调用的方法没有被定义,程序将会在编译时或者运行时报错并结束,这会阻止我们困死在我们的代码中.

01  NSString *testString = [emailAddress addSparkles]; 02  // testString will equal "nil" because, believe it or not,03  // "addSparkles" 不是一个有效的 NSString方法.

返回我们的讨论…

记得这些方括号被用来区分Objective-C结构体和C语言代码.围绕在name length周围的方括号说明了方法被调用.这个方法计算的长度是21,然后返回给调用这个方法的地方.我们将这个返回值赋值给一个新的名字是stringLengthint 型变量.这样看起来像是21取代了 [name length]的位置.

01  // We can basically replace the method call with 02  // the value it returns03  int stringLength = 21;

方法参数

方法还有一些地方来放置参数.让我们来看一个新的例子,之前 length 不需要任何参数,现在,让我们给它加入简单的两个int类型的参数:

01  - (int)addX:(int)x toY:(int)y {02      int sum = x + y;03      return sum;04  }

哇! 是不是看起来有点乱?如果你之前学过其他的语言(像是JavaScript),那样理解起来这个就有一些难了.让我们把这个句子拆开来一点一点的看.定义的第一部分:

- (int)addX

破折号表示这是一个实例方法(method), (int) 表示这个方法返回 int 型的值, 这个方法的名字是“addX”.

参数是从方法名字后面的冒号之后开始具体说明的,一个数据类型和他自己的名字:

 :(int)x

表示这个方法的第一个参数是名字是xint 类型变量.
添加的参数用相同的方式来说明,但是我们也放了一些奇怪的东西在这个方法里的新地方,让我们来看看:

toY:(int)y

第一部分,“toY”,是消息(message)的名字.这个消息(message)的全名是“addX:toY:”. 抛去冒号,剩下的内容(addXtoY)就可以从字面上解释了这个方法的作用,冒号指定了放置参数的地方.第二个参数和第一个参数很相似,是一个名为yint 型变量.

我们可以通过往参数中塞入变量或值的方式来调用一个方法.在 上面的length 例子中,length 方法是在NSString类中定义的,所以我们通过给参数塞入一个string类型的变量来调用它.(或者我们可以说我们给发送了length 消息给一个string类型的变量.)在这个例子中,让我们假设addX:toY: 这个方法是被定义在一个GameScore(游戏分数)类中,然后我们有一个名为“score”的变量,这个变量拥有GameScore这个数据类型:

01  int points = 100;02  int newScore = [score addX:24 toY:points];03  // newScore now equals 124

注意我们用一个字面量值(24)或一个变量(points)为参数保存一个值.我们也注意到了在调用方法的过程中,参数的名字并不重要.参数的名字用在组成方法的代码中和定义中,但是当我们调用方法的时候,名字就和代码无关了.

函数的功能是什么?

在这一节的开头,我提到了 “functions” 这个词,因为就像方法(methods),它们是我们从其他地方调用的可以重复使用的代码块.一个很常见的例子就是 NSLog() 函数,这个函数的功能是打印数据到操作系统日志:

NSLog(@"This is some string data being written to the log.");

函数是来自C语言的原生的“method(方法)”结构,但是它们的语法还是有一点点的不同.在上面的NSlog例子中,“NSLog”是这个函数的名字,后面的括号用来放置参数. 函数(Functions)总是以一对括号结尾的,即使括号里面没有任何内容.在这个例子中我们传递了一个string类型的参数.那么这个方法(method)看起来就像下面这样:

01  void NSLog(NSString *text) {02      // Logging code03  }

注意到了函数的调用不需要任何类的引用来调用.我们之前的例子:是通过emailAddressscore这两个变量来调用的.这些变量给方法做出动作的环境加了框架.函数可以在任何地方被调用,只要有数据传递给它们函数就可以做出行为.

任何Objective-C方法都能够通过C语言的语法重写为一个函数. 再想一下我们在part1中提到的:Objective-C维持了C语言所有语法,只是添加了面向对象的特特点.

使用方法最主要的好处

假如我们想知道五个不同的NSString类型变量的长度.如果我们没有length 方法可供使用.我们就不得不编写五次代码去计算.但是我们可以创建一个可重复使用的”方法”,然后我们每次仅仅需要一行代码去计算一个String值得长度.编程要讲究效率,所以尽可能地使用”方法”去组织你的代码,这将会节省你的工作量.

还有一个好处就是当我们使用”方法”的时候,我们的代码变得更加有可读性.当方法被使用的时候,凭借其直观的名字和清晰的行为,将减少很多行晦涩难懂的代码,继而代替的是我们能够很快理解的简明的代码.作为程序员,我们花了大量的时间在读代码上,我们在分析我们以前的代码,想要去记起来很长一段时间之前我们写的什么代码,或者想要去理解或者完善其他人的代码.

即将到来!
我们已经讲了一些,Objective-C是怎么组织的,但是我们还有大量重要的东西去讲,像什么是类和对象,它们是怎么使用的.
Happy coding!

0 0
原创粉丝点击