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

4.3 方法(任務)

本節,我們就來討論如何在類中定義和使用方法(method)。再次說明,在Apple官方文檔中,方法稱為任務(Task)。

■4.3.1 創建方法

前面,我們已經了解到,在類中的方法可以分為實例方法和類方法,在這里,我們將主要討論實例方法,而類方法除了在定義時使用+符號,其他的要素都與實例方法相同。

接下來,我們會根據參數的數量,分為三種情況來討論方法的定義,包括:

? 沒有參數的方法。

? 有一個參數的方法。

? 有兩個或更多參數的方法。

為什么要這樣玩呢?我想這一定是某些人的情懷造成的(肯定不是我的),我只是想,這樣介紹也許更能幫助大家理解。

在討論方法的參數之前,我們需要了解,方法都是要設置返回值類型的,與函數不同的是,方法的返回值類型需要使用一對圓括號,如下面的代碼。

    -(int) getId;

如果返回值類型是一個對象類型,不要忘記使用*符號(因為對象是指針了),如下面的代碼。

    -(NSString*) getName;

如果方法沒有返回值,則使用void關鍵字來指定。

    -(void) move;

接下來,我們就討論參數的三種情況。

1.沒有參數的方法

前面示例中,我們創建的就是沒有參數的方法,格式很簡單,如下面的代碼(以實例方法為例)。

    -(<返回值類型>) <方法名>;

如下面的代碼,我們就會在CRobot類中再定義一個沒有參數的work方法,首先在接口部分聲明它。

    @interface CRobot : NSObject
    -(void) work;
    // 其他代碼
    @end

然后,在實現部分定義work方法,如下面的代碼。

    @implementation CRobot
    -(void) work
    {
        NSLog(@"機器人工作中");
    }
    // 其他代碼
    @end

我們使用如下代碼調用這個方法。

    CRobot *robot5 = [[CRobot alloc] init];
    [robot5 work];

2.有一個參數的方法

當方法有一個參數時,我們使用如下格式定義(以實例方法為例)。

    -(<返回值類型>) <方法名> : (<參數類型>)<參數變量>;

我們還是先在接口部分聲明方法,如下面的代碼。

    @interface CRobot : NSObject
    -(void) work : (NSString*) name;
    // 其他代碼
    @end

然后,在實現部分定義這個方法。

    @implementation CRobot
    -(void) work : (NSString*) name
    {
        NSLog(@"機器人 %@ 正在工作", name);
    }
    // 其他代碼
    @end

我們使用如下代碼調用這個方法。

    CRobot *robot5 = [[CRobot alloc] init];
    [robot5 work : @"No.5"];

也許你也發現了,我們定義的兩個方法都是work,這不會有沖突嗎?不會的,它們的參數數量是不一樣的,調用時會自動匹配,并找到需要執行的那一個方法。

3.有兩個或更多參數的方法

當方法中有兩個或更多參數時,參數之間使用空格符分隔,并且,從第二個參數開始使用下面的格式定義。

    <參數名稱>:(<參數類型>) <參數變量>

如下面的moveToX:Y:方法,我們定義了兩個參數,首先還是在接口部分聲明。

    @interface CRobot : NSObject
    -(void) moveToX:(float)mx Y:(float) my;
    @end

接著,我們在類的實現部分定義這個方法。

    @implementation CRobot
    -(void) moveToX:(float)mx Y:(float) my
    {
        NSLog(@"移動坐標到(%f, %f)", mx, my);
    }
    @end

我們使用如下代碼來調用這個方法。

    CRobot *robot5 = [[CRobot alloc] init];
    [robot5 moveToX:10.0 Y:15.0];

實際上,我們可以看到,這種定義參數的形式會讓方法使用起來更像是一句自然語言,比如,這個moveToX方法的調用,包含參數的意思就是“移動到X坐標10.0和Y坐標15.0”。不過,這里的自然語言顯然指的是英文。

當然,如果不想在方法中使用繞口的英文,也可以不使用<參數名稱>,如下面的代碼。

    // 接口部分
    @interface CRobot : NSObject
    -(void) moveTo:(float)mx :(float)my;
    @end
    // 實現部分
    @implementation CRobot
    -(void) moveTo:(float)mx :(float)my
    {
        NSLog(@"移動坐標到(%f, %f)", mx, my);
    }
    @end

如果不使用<參數名稱>,則每個參數使用冒號(:)開始,然后包括<參數類型>和<參數變量>即可。我們可以使用如下代碼來調用這個方法。

    CRobot *robot5 = [[CRobot alloc] init];
    [robot5 moveTo:100 :200];

■4.3.2 description方法與NSLog()函數

在Objective-C定義的類中,還可以使用一些特殊成員,description方法就是其中之一,它的功能就是返回對象的描述。

descrition方法定義在NSObject類中,下面的代碼,我們將在CRobot類的實現代碼中重寫這個方法。

    @implementation CRobot
    -(NSString*) description
    {
        return @"這是機器人對象";
    }
    @end

然后,我們可以在NSLog()函數中使用%@格式化字符來顯示對象信息,如下面的代碼。

    CRobot *robot5 = [[CRobot alloc] init];
    NSLog(@"%@", robot5);

前面的內容中,我們已經看到NSLog()函數中使用的一些格式化字符,如基本數據類型的格式化字符,而%@格式化字符用于顯示對象信息,這些對象信息就可以通過重寫類的description方法定義。

主站蜘蛛池模板: 徐水县| 英吉沙县| 邻水| 屏南县| 青州市| 托克托县| 合水县| 竹山县| 台北县| 郓城县| 郴州市| 长阳| 德清县| 北票市| 楚雄市| 贵港市| 舟山市| 彭州市| 资阳市| 苏尼特左旗| 万山特区| 兰溪市| 夏津县| 苏尼特右旗| 霍山县| 虞城县| 荃湾区| 沙湾县| 金昌市| 武功县| 惠州市| 商河县| 仙游县| 宿州市| 肥西县| 大庆市| 崇文区| 花莲市| 新竹市| 洪雅县| 鄄城县|