Objective-C函式


函式是一組一起執行任務的語句。 每個Objective-C程式都有一個C函式,也就是main()函式,所有最簡單的程式都可以定義為函式。

可將程式碼劃分為單獨的函式。如何在不同的函式之間劃分程式碼取決於程式員,但邏輯上這個劃分通常是這樣,每個函式執行一個特定的任務。

函式宣告告訴編譯器函式的名稱,返回型別和引數。 函式定義提供函式的實際主體。

在Objective-C中,基本上會將函式稱為方法。

Objective-C基礎框架提供了程式可以呼叫的許多內建方法。 例如,appendString()方法將字串附加到另一個字串。
已知一種方法具有各種名稱,如函式或子程式或程式等。

1. 定義方法

Objective-C程式設計語言中方法定義的一般形式如下 -

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

Objective-C程式設計語言中的方法定義由方法頭和方法體組成。 以下是方法的所有部分 -

  • 返回型別 - 方法可以返回值。return_type是函式返回的值的資料型別。 某些方法執行所需的操作而不返回值。 在這種情況下,return_type是關鍵字void
  • 方法名稱 - 這是方法的實際名稱。方法名稱和引數列表一起構成方法簽名。
  • 引數 - 引數就像一個預留位置。呼叫函式時,將值傳遞給引數。該值稱為實際引數或引數。引數列表指的是方法的引數的型別,順序和數量。 引數是可選的; 也就是說,方法可能不包含任何引數。
  • 連線引數 - 一個連線的引數是讓它更易於閱讀並在呼叫時清楚地表達它。
  • 方法體 - 方法體包含一組語句,用於定義方法的作用。

範例
以下是名為max()的方法的原始碼。 這個方法有兩個引數num1num2,並返回兩個引數的最大值 -

/* 返回兩個引數的最大值 */
- (int) max:(int) num1 secondNumber:(int) num2 {

   /* 區域性變數宣告 */
   int result;

   if (num1 > num2) {
      result = num1;
   } else {
      result = num2;
   }

   return result; 
}

2. 方法宣告

方法宣告告訴編譯器有關函式名稱以及如何呼叫該方法的資訊。 函式的實際主體可以單獨定義。

方法宣告包含以下部分 -

- (return_type) function_name:( argumentType1 )argumentName1 
joiningArgument2:( argumentType2 )argumentName2 ... 
joiningArgumentn:( argumentTypen )argumentNamen;

對於上面定義的max()函式,以下是方法宣告 -

-(int) max:(int)num1 andNum2:(int)num2;

在一個原始檔中定義方法並在另一個檔案中呼叫該方法時,需要方法宣告。 在這種情況下,應該在呼叫該函式的檔案頂部宣告該函式。

3. 呼叫方法

在建立Objective-C方法時,可以定義函式必須執行的操作。 要使用方法,必須呼叫該函式來執行定義的任務。
當程式呼叫函式時,程式控制將轉移到被呼叫的方法。 被呼叫的方法執行已定義的任務,當執行其返回語句或達到其函式結束右括號時,它將程式控制返回給主程式。
要呼叫方法,只需要傳遞必需的引數和方法名稱,如果方法返回值,則可以儲存返回的值。 例如 -

#import <Foundation/Foundation.h>

@interface SampleClass:NSObject
/* 方法宣告 */
- (int)max:(int)num1 andNum2:(int)num2;
@end

@implementation SampleClass

/* 返回兩個數的最大值 */
- (int)max:(int)num1 andNum2:(int)num2 {

   /* 宣告區域性變數 */
   int result;

   if (num1 > num2) {
      result = num1;
   } else {
      result = num2;
   }

   return result; 
}

@end

int main () {

   /* 定義區域性變數 */
   int a = 119;
   int b = 199;
   int ret;

   SampleClass *sampleClass = [[SampleClass alloc]init];

   /* 呼叫方法來獲取最大值 */
   ret = [sampleClass max:a andNum2:b];

   NSLog(@"Max value is : %d\n", ret );
   return 0;
}

執行上面範例程式碼,得到以下結果:

2018-11-15 01:18:49.962 main[43680] Max value is : 199

4. 函式引數

這些變數稱為函式的形式引數。形式引數的行為與函式內部的其他區域性變數相似,並在進入函式時建立,並在退出時銷毀。
在呼叫函式時,有兩種方法可以將引數傳遞給函式 -

編號 呼叫型別 描述
1 按值呼叫 此方法將引數的實際值複製到函式的形式引數中。在這種情況中,對函式內部引數所做的更改不會對引數產生影響。
2 按參照呼叫 此方法將引數的地址複製到形式引數中。在函式內部,該地址用於存取呼叫中使用的實際引數。對引數所做的更改會影響引數。

預設情況下,Objective-C使用按值呼叫來傳遞引數。 所以函式內的程式碼改變用於呼叫函式的引數不會反應到函式外部,而上述範例在呼叫max()函式時使用相同的方法。