- Objective-C和Sprite Kit游戲開發從入門到精通
- 曹化宇
- 1399字
- 2021-01-07 18:57:42
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方法定義。