2

このような質問があった場合は申し訳ありませんが、ブール値を理解していると思っていたので、混乱しています。コマンドラインの obj-c プログラムでは、BigNerdRanch の本によると、main 関数はブール値で false を意味する 0 を返し、それが true または 1 を返す場合はエラーが発生したことを意味するため、これは良いことです。

したがって、この本の後半にあるこのコードは、私を混乱させます。

-(BOOL)readFromData (NSData *)data ofType:(NSString *)typeName error(NSError **)outError


todoItems = [NSPropertyListSerialization propertyListWithData: data 
options:NSPropertyListMutableContainers 
format:NULL
error:outError

return (todoItems != nil);

このコードは基本的に、todoItems にデータが読み込まれるため、ポインターが nil に設定されないため、true と評価され、メソッドの BOOL 値として true が返され、エラーが発生したことを意味します。私はこれにとても混乱しています。

4

3 に答える 3

3

mainBOOL を返すメソッドのセマンティクスと、 を返す関数を混同しないでくださいint

C では、多くの関数intが成功または失敗を示す値を返します。0は通常成功を意味しますが、ゼロ以外 ( だけではない1) は何らかのエラー コードです。コードは、ほぼゼロ以外の数値にすることができます。これは、70 年代から使用されてきた規則にすぎません。

を返すメソッドを作成するときはBOOL、エラー コードを処理していません。またはのいずれYESNOです。NO通常、失敗したことをYES意味し、成功したことを意味します。

NO値がであるという事実は、成功を示すため0に を使用する古い標準 C 規則とはまったく関係ありません。0それらの意味を混同しないでください。

BOOL文章を読むように値の使い方を読む。

if ([someClass readFromData...]) {
}

このように読んでください。の成功値は、YESそれが機能し、コードを読むことが理にかなっていることを意味します。

于 2013-08-02T02:40:30.333 に答える
0

return (todoItems != nil);基本的には、todoItemsisnilの場合は式が評価され、 is でないreturn false;場合は次のようになることを意味します。todoItemsnilreturn true;

コンパクトな if ステートメントと考えてください。

編集:あなたの質問を誤解して申し訳ありません。しかし実際には、この本の著者は、戻り値を使用してエラーを示す方法の例を示しようとしていると思います。おそらく、エラーが発生したときに loadfunction が返さnilれるため、プログラムは で終了しreturn trueます。これはエラーです。

于 2013-08-02T02:33:08.810 に答える
0

ゼロを返す main() 関数は、慣例により、プログラムが正常に終了したことを意味します。エラーが発生した場合、main() からゼロ以外の値が返されます。これらのエラー値は、プログラム固有の意味を持つ場合もあれば、標準の POSIX エラー値である場合もあります。

BOOL 値を返すその他の関数の場合、YES が成功を意味するか失敗を意味するか (NO の場合はその逆) を示すのは、実装者次第です。この場合、-readFromData:ofType:error: は、nil 以外のデータ セットがある場合に YES を返します。私はその本を持っていませんが、YES は成功にマッピングされ、NO は失敗にマッピングされることを意味していると思います。

つまり、main() からの戻り値の規則は、BOOL を返す関数からの戻り値の規則と必ずしも相関するとは限りません。後者には規則がないからです。

于 2013-08-02T02:45:41.860 に答える