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