Day 06 - Function

Function 是一组一起执行任务的语句,而每个 Objective-C 都有一个 C function,也就是 main。可以将代码划分成独立的Function(函数),该如何划分取决於个人,通常每个函数都有特定的任务。

声明函数 就是告诉编译器这函数的名称、返回值、参数。
定义函数 则是提供编译器这函数的主要内容。

在 Objective-C 中,通常称函数(function)为方法(method)
Objective-C 提供了许多内建方法可以使用。例如:appendString():字串加上另一个字串


定义(Defining)方法

- (return_type) method_name:( argumentType1 )argumentName1 
joiningArgument2:( argumentType2 )argumentName2 ... 
joiningArgumentn:( argumentTypen )argumentNamen {
   body of the function
}

方法由 header 跟 body 组成

  • Return Type(返回类型):方法可以返回一个值,如果该方法不返回值的话,return_typevoid
  • Method Name(方法名称):这是方法的实际名称。
  • Arguments(参数):当函数被调用时,将传递一个值给参数。参数是可选的,也就是説,一个方法可以不包括任何参数。
  • Joining Argument(加入参数):为了使其更易於阅读并在调用时使其清晰。
  • Method Body(方法本体):定义这方法要做的事。

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

声明(Declarations)方法

声明方法告诉编译器 方法名称、如何调用该方法。与前者(定义方法)的差别在於,可以先不写 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

函数参数

call by value

对函数内部参数所做的更改对参数本身没有影响。
默认情况下,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

call by reference

参数(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---阵列

>>:  Day23 切版笔记- 人员介绍卡片

把 Clear Linux 安装到我的 Mac mini (Late 2014)

Mac mini (2014 年末) 这一部机器,我刚入手的时候,主要拿来上网、文书处理以及制作网...

Golang 学习笔记-- 快速上手/重点整理 - 1

有鉴於自己的金鱼脑,常常学了东西就瞬间忘光,觉得需要找寻一个方式让自己能够纪录并且整理内化。因此决定...

Android Studio初学笔记-Day18-Intent+Bundle

Intent+Bundle Intent常用於画面的跳转,也就是Activity之间的切换,而在In...

Day11-"一维阵列练习"

利用scanf将各年级的每班人数存进阵列里,并印出结果。总共3个年级每个年级有10个班。 . . ....

Django - template filter and tags

context的内容: sub_dual = [{'start':1, 'end':2, 'text...