質問: iOSプログラミングではエラーコードを `OSStatus`型 で表現しますが、アプリケーション独自のエラーコード定義に使ってよい値の範囲は公式に存在するのでしょうか?コールバック関数からの戻り値などで、システム/フレームワーク定義値と重複しえないエラーコードを定義したいためです。 Web上で検索すると「1000 ~ 9999 がそのような用途に予約済み」という主張も見かけはするのですが、できればApple公式リファレンスなどがあると助かります。 --- 追記:本質問の意図は「新規設計する自前ソースコード部で `OSStatus` 型を利用したい」わけではなく、「コールバック関数と組み合わせて用いるレガシーAPIにおいて、コールバック関数が返す `OSStatus`型 の独自エラーコードと、同レガシーAPIが返すエラーコードの衝突が起きない保証を得たい」です。 具体的には `AudioConverterFillComplexBuffer` 関数と、コールバック `AudioConverterComplexInputDataProc` において、後者コールバック関数から「アプリケーション独自のエラーコード値」を返して`AudioConverterFillComplexBuffer`呼び出し元に伝搬したいが、フレームワークが定義するエラーコード値との衝突は避けたいです。
回答: `NSException`を使うのはいかがでしょうか? `MYException.h` ``` extern NSString * _Nonnull const Name1; extern NSString * _Nonnull const Reason1; extern NSString * _Nonnull const Name2 extern NSString * _Nonnull const Reason2; @interface MYException: : NSException @end ``` `MYException.m` ``` NSString * _Nonnull const Name1 = @"エラーの名前1"; NSString * _Nonnull const Reason1 = @"エラーの具体的な内容1"; NSString * _Nonnull const Name2 = @"エラー名前2"; NSString * _Nonnull const Reason2 = @"エラーの具体的な内容2"; @implement MYException @end ``` コールバック先でエラーが発生した場合、そのエラーがわかった所で ``` @throw [MYExceptioon exceptionWithName:Name1 reason:Reason1 userInfo:nil]; ``` の様な感じで例外を`throw`します。 `userInfo`はこの例では`nil`にしてなにも渡していませんが、`NSDictionary`オブジェクトを受け渡しする事でエラーコードや、エラーが起きたオブジェクトなど、より詳細な情報を受け渡す事ができます。 コールバック元は、例外を受け取れるように ``` @try { // この中でコールバック先を呼ぶ // (本来のエラーが起きなかったときのアルゴリズム) } @catch (MYException *exception) { // @throwされると、同じ型の処理を宣言したcatchに落ちてくる。 // *exceptionを用いて例外処理 } @catch (NSException *exception { // 型が違う例外もこの様にしてcatch出来る // @catch (型 *変数名) の型はNSExceptionを継承している必要はない } @finally { // 例外が起きても起きなくても例外発生後に行いたい処理 } ``` という記述をする必要がありますが、エラーがなければ`@try`の中を順次処理していき、あれば`@finally`の中が、そしてブロックの外に続いて処理が行われるので、本来のアルゴリズムとエラー処理を分離して書けるというメリットがあります。