Objective-Cのメソッドの戻り値の型は「BOOL」が良いと思っています。
こう書くと、何でもかんでも「BOOL」にするべきだと、言っているように誤解されてしまいますね。「BOOL」にした方が良いと思うのは、次のタイプのメソッドのときです。
- 成功したのか失敗したのかを返すとき
C言語であれば、成功したかどうかを返すときは、エラーコードを返すことが多くあります。エラーコードは一般的には整数型です。そして、エラーコードとして一般的に使われるのは、「0はエラー無し」という定義です。
MacのCarbonの関数でも「noErr」という定数が定義されていて、「エラー無し」を示し、この定数の値は「0」です。
Objective-Cでも同様に、戻り値の型を整数型にしてエラーコードを返すようにすることはできますが、ちょっと考えると不便な点が出てきます。
今、「MyObject」というクラスがあるとし、そのクラスには「doSomething」というメソッドがあるとします。このメソッドは、エラーコードを返し、成功したら「noErr」を返すものとします。それと、「MyObject」クラスの共有インスタンスを返す「sharedInstance」というメソッドもあるとします。
[cc lang="objc"] @interface MyObject + (MyObject *)sharedInstance; - (NSInteger)doSomething; @end [/cc]
次のようなコードを考えてみます。
[cc lang="objc"] MyObject *obj = [MyObject sharedInstance]; if ([obj doSomething] == noErr) { NSLog(@"Successed"); } [/cc]
特におかしなところはないコードです。ここで、「sharedInstance」が、このクラスを使用できないマシンでは「nil」を返すとするとちょっと問題が起きます。「obj」が「nil」になってしまうと、「[obj doSomething]」は「0」になってしまい、「noErr」になってしまいます。「obj」が「nil」ということは、クラスを使用できないので「doSomething」も失敗なのにです。「obj」が「nil」ではないかどうかをチェックすることもできますが、それよりも、Objective-Cの特徴を活かして、戻り値の型を「BOOL」にしてみると次のようになります。
[cc lang="objc"] @interface MyObject + (MyObject *)sharedInstance; - (BOOL)doSomething; @end [/cc]
[cc lang="objc"] MyObject *obj = [MyObject sharedInstace]; if ([obj doSomething]) { NSLog(@"Successed"); } [/cc]
このようにすると、失敗したときは「NO」が返り、「obj」が「nil」のときは「0」なので「NO」という解釈になります。「obj」が「nil」のときも、本当に「doSomething」が失敗したときも同じ扱いになります。
このような理由で「成功したのか失敗したのかを返すとき」は「BOOL」にした方が良いと思います。