iT邦幫忙

2021 iThome 鐵人賽

DAY 5
0
自我挑戰組

iOS 菜鳥工程師的30天 objective-C系列 第 6

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 05 - 決策(if, switch)
下一篇
Day 07- Blocks
系列文
iOS 菜鳥工程師的30天 objective-C10

尚未有邦友留言

立即登入留言