Function 是一组一起执行任务的语句,而每个 Objective-C 都有一个 C function,也就是 main
。可以将代码划分成独立的Function(函数),该如何划分取决於个人,通常每个函数都有特定的任务。
声明函数 就是告诉编译器这函数的名称、返回值、参数。
定义函数 则是提供编译器这函数的主要内容。
在 Objective-C 中,通常称函数(function)为方法(method)
Objective-C 提供了许多内建方法可以使用。例如:appendString()
:字串加上另一个字串
- (return_type) method_name:( argumentType1 )argumentName1
joiningArgument2:( argumentType2 )argumentName2 ...
joiningArgumentn:( argumentTypen )argumentNamen {
body of the function
}
方法由 header 跟 body 组成
return_type
为 void
。ex.
以下是名为 add() 的方法,有两个参数 num1 和 num2 并有类型为 int
的返回值,返回两数相加的值。
- (int) add: (int) num1 secondNumber: (int) num2 {
int result;
result = num1 + num2;
return result;
}
结果:
NSLog(@"result: %d",[self add:2 secondNumber:3]);
2021-09-21 23:38:09.857672+0800 TestOC[649:3457296] result: 5
声明方法告诉编译器 方法名称、如何调用该方法。与前者(定义方法)的差别在於,可以先不写 Method Body,之後另再定义。
- (return_type) function_name:( argumentType1 )argumentName1
joiningArgument2:( argumentType2 )argumentName2 ...
joiningArgumentn:( argumentTypen )argumentNamen;
以前面add()
为例,以下是方法的声明:
- (int) add: (int) num1 secondNumber: (int) num2;
当在另一个 file 调用该方法时,需要声明方法。在这种情况下,应该在该 file 的顶部声明该方法。
当创立方法後,需要去定义该方法必须做什麽。要使用该方法,必须调用该方法去执行预定的任务。
当程序调用方法时,程序控制会转移到被调用的方法。当方法的return语句被执行或到达右括号时,程序控制将返回给主程序。
要调用方法,只需给所要求的参数及方法名称,如果方法返回一个值,可以存储返回值。如下:
#import <Foundation/Foundation.h>
@interface SampleClass : NSObject
//声明方法
- (int)add: (int)num1 andNum2: (int)num2;
@end
@implementation SampleClass
//方法返回相加值
- (int)add:(int)num1 andNum2:(int)num2 {
//局部变量声明
int result;
result = num1 + num2;
return result;
}
@end
int main () {
//局部变量定义
int a = 100;
int b = 200;
int sum;
SampleClass *sampleClass = [[SampleClass alloc] init];
//调用方法
sum = [sampleClass add:a andNum2:b];
NSLog(@"总和为:%d",sum);
return 0;
}
结果:
2021-09-23 16:49:12.955106+0800 TestOC[19579:604209] 总和为:300
对函数内部参数所做的更改对参数本身没有影响。
默认情况下,Objective-C 使用 call by value 来传递参数。这意味着函数内的代码不能更改被调用该的参数。
以 swap() 为例:
#import <Foundation/Foundation.h>
@interface SampleClass : NSObject
- (void)swap: (int)num1 andNum2: (int)num2;
@end
@implementation SampleClass
- (void)swap:(int)num1 andNum2:(int)num2 {
int temp;
temp = num1; //储存 num1
num1 = num2;
num2 = temp;
}
@end
int main () {
//局部变量定义
int a = 100;
int b = 200;
SampleClass *sampleClass = [[SampleClass alloc] init];
NSLog(@"使用前, a值: %d\n", a );
NSLog(@"使用前, b值: %d\n", b );
//调用方法
[sampleClass swap:a andNum2:b];
NSLog(@"使用後, a值: %d\n", a );
NSLog(@"使用後, b值: %d\n", b );
return 0;
}
结果:
2021-09-23 17:09:33.753566+0800 TestOC[19928:622339] 使用前, a值: 100
2021-09-23 17:09:33.754077+0800 TestOC[19928:622339] 使用前, b值: 200
2021-09-23 17:09:33.754167+0800 TestOC[19928:622339] 使用後, a值: 100
2021-09-23 17:09:33.754264+0800 TestOC[19928:622339] 使用後, b值: 200
将参数(arguments)
的地址复制到形式参数(formal parameter)
中,这意味着对形式参数(formal parameter)
所做的更改会影响到参数(arguments)
。
以 swap() 为例:
#import <Foundation/Foundation.h>
@interface SampleClass : NSObject
- (void)swap: (int *)num1 andNum2: (int *)num2;
@end
@implementation SampleClass
- (void)swap:(int *)num1 andNum2:(int *)num2 {
int temp;
temp = *num1; //储存 num1
*num1 = *num2;
*num2 = temp;
}
@end
int main () {
//局部变量定义
int a = 100;
int b = 200;
SampleClass *sampleClass = [[SampleClass alloc] init];
NSLog(@"使用前, a值: %d\n", a );
NSLog(@"使用前, b值: %d\n", b );
//调用方法
[sampleClass swap:&a andNum2:&b];
NSLog(@"使用後, a值: %d\n", a );
NSLog(@"使用後, b值: %d\n", b );
return 0;
}
结果:
2021-09-23 17:17:43.091083+0800 TestOC[20126:631675] 使用前, a值: 100
2021-09-23 17:17:43.091644+0800 TestOC[20126:631675] 使用前, b值: 200
2021-09-23 17:17:43.091740+0800 TestOC[20126:631675] 使用後, a值: 200
2021-09-23 17:17:43.091844+0800 TestOC[20126:631675] 使用後, b值: 100
<<: [Day 8]从零开始学习 JS 的连续-30 Days---阵列
Mac mini (2014 年末) 这一部机器,我刚入手的时候,主要拿来上网、文书处理以及制作网...
有鉴於自己的金鱼脑,常常学了东西就瞬间忘光,觉得需要找寻一个方式让自己能够纪录并且整理内化。因此决定...
Intent+Bundle Intent常用於画面的跳转,也就是Activity之间的切换,而在In...
利用scanf将各年级的每班人数存进阵列里,并印出结果。总共3个年级每个年级有10个班。 . . ....
context的内容: sub_dual = [{'start':1, 'end':2, 'text...