官术网_书友最值得收藏!

2.10 自定義函數

前面,已經使用了NSLog()函數來顯示信息,接下來,我們看一看如何創建自己的函數,而這些函數可以幫助我們更好地組織代碼和實現軟件功能。

函數是一種基本的代碼封裝與組織形式,我們知道,在一艘軍艦上,只有各個崗位的人員都能夠各盡其責,軍艦才能夠正常運行,才會有戰斗力。而函數對于整個程序來講,也是這樣,必須能夠正確、高效地完成本職工作才稱得上是一個合格的函數。

從圖2-16中,我們可以看到,程序會從main()函數開始,然后會有大量的函數來支援它,這就是函數的基本工作方式。目前為止,我們使用的示例項目都是這種工作方式。此外,在Objective-C中,我們還可以使用另一種代碼組織形式,這就是使用面向對象編程(OOP),在第4章,我們會討論相關內容。

圖2-16 函數的調用

在Objective-C中聲明函數的格式如下。

    <返回值類型> <函數名>(<參數列表>);

如果我們實現這個函數,就不使用分號,而是將函數的代碼放在一對花括號{}之間。如下面的代碼。

    #import <Foundation/Foundation.h>
    void sayHello()
    {
        NSLog(@"Hello! ");
    }
    int main(int argc, const char *argv[])
    {
        @autoreleasepool {
            sayHello();
        }
        return 0;
    }

代碼中,我們定義了一個無返回值、無參數的sayHello()函數,然后,在main()函數中調用它;執行代碼會顯示“Hello! ”。

接下來,我們討論一下定義函數時需要注意的幾個問題。

■2.10.1 返回值類型

返回值類型,也就是函數運行結果的數據類型;在函數中,使用return語句返回這個數據;如果函數不需要返回數據,就像上面的代碼一樣,可以將返回值類型定義為void。

返回值的類型可以是前面介紹的基本數據類型,也可以是對象,比如,函數需要返回一個字符串對象(NSString類型),還應該使用*運算符。如下面的代碼。

    NSString* getName()
    {
        return @"你猜!^_^";
    }

關于對象的相關內容,我們會在第4章介紹,大家不用著急。

■2.10.2 函數名

函數的名稱,本書中的自定義函數名會使用首字母小寫,其他單詞首字母大寫的形式。

函數名應該反映出函數的功能,在Objective-C中,函數命名會有一些約定,遵循這些約定,可以更有效地使用這些函數,在后續的應用中,我們就可以看到這一點。

■2.10.3 參數

參數列表,在定義函數時,可以沒有參數,像上面代碼中定義的sayHello()函數,也可以有一個或多個參數,每一個參數都應包含兩個基本部分,即參數類型和參數變量,如下面的代碼。

    #import <Foundation/Foundation.h>
    int addInt(int x, int y)
    {
        return x + y;
    }
    int main(int argc, const char *argv[])
    {
        @autoreleasepool {
            int sum = addInt(6, 4);
            NSLog(@"sum = %i", sum);
        }
        return 0;
    }

在我們定義的addInt()函數中,定義了兩個參數,分別是x和y,它們都是int類型的,而addInt()函數的功能就是返回這兩個參數的和,其返回值類型同樣是int類型。

■2.10.4 參數指針

下面,我們創建一個函數,嘗試交換兩個int變量的值,這個看上去似乎并不難,馬上動手,如下面的代碼。

    void swapInt(int x, int y)
    {
        int temp = x;
        x = y;
        y = temp;
    }

然后,使用如下代碼來調用這個函數。

    int main(int argc, const char *argv[])
    {
        @autoreleasepool {
            int num1 = 10;
            int num2 = 99;
            NSLog(@"num1 = %i , num2 = %i",  num1, num2);
            swapInt(num1, num2);
            NSLog(@"num1 = %i , num2 = %i",  num1, num2);
        }
        return 0;
    }

問題來了!上面的代碼并不會交換num1和num2的值。

這是為什么呢?

原因是,當我們將num1和num2變量傳遞給swapInt()函數時,參數復制了它們的數據。在函數內部,只是在交換數據副本的值,而不是真正地交換num1和num2變量的值。

那么,如何才能真正地修改參數的值呢?答案就是,在參數中使用指針,下面就是修改后的swapInt()函數。

    void swapInt(int *x, int *y)
    {
    int temp = *x;
    *x = *y;
    *y = temp;
}

在調用swapInt()函數時,我們同樣需要做一些修改,如下面的代碼。

    swapInt(&num1, &num2);

這樣,我們就可以通過swapInt()函數順利地交換兩個int變量的值了。

主站蜘蛛池模板: 乐山市| 仙桃市| 海晏县| 九台市| 寿光市| 营口市| 泾阳县| 博野县| 花莲县| 乐业县| 诸城市| 新宾| 南岸区| 醴陵市| 无锡市| 威信县| 西丰县| 清丰县| 屏东市| 珲春市| 双桥区| 高碑店市| 浦江县| 桑植县| 乐山市| 大英县| 永川市| 英山县| 新宁县| 株洲市| 泰顺县| 周宁县| 南城县| 山丹县| 阳城县| 巩义市| 云梦县| 湟中县| 黔西县| 台前县| 庆安县|