質問: ``` - (NSRange)rangeOfFirstMatchInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range; ``` 例えば上記の`NSMatchingOptions`に該当しない値(例えば`nil`or`0`)を渡した場合の処理はどうなるのでしょうか? nilになって`options`がスルーされてしまうと正しく処理できすエラーになりそうなものですが、ならなかったので・・・
回答: 一般的にはAPIのパラメータに規定外の値を渡した時の動作は未定義であり、そのせいでアプリがクラッシュすることもあります。 ただし、`Options`で終わるenum型の多くは、bitwise-ORで複数の値を組み合わせて使えるようになっています。(Objective-Cのヘッダファイルを開くと単純なenum宣言ではなく、`NS_OPTIONS`マクロを使って定義されているものがこれに当たります。) ``` NSMatchingOptions mo = NSMatchingReportCompletion | NSMatchingAnchored; NSRange range = [regex rangeOfFirstMatchInString:str options:mo range:NSMakeRange(0, [str length])]; ``` ここで指定している`NSMatchingReportCompletion | NSMatchingAnchored`という値は、`NSMatchingOptions`のenumで定義されているどの値とも違いますが、「規定外の値」ではなく、「`NSMatchingReportCompletion`と`NSMatchingAnchored`の両方を指定している」ものとして扱われます。(この組み合わせにどんな意味があるかは一旦忘れてください...。) 同じように`0`という値(`NSMatchingOptions`はC言語的には単なる整数型です)は、「`NSMatchingOptions`のenumで定義されているどの値も指定しない」ことを表しているだけで、規定外の値ではありません。 (私自身は好みませんが、`nil`は整数型の0に変換できるので、「どの値も指定しない」ことを表すのに`nil`を使う人もいるのかもしれません。) Cmd-clickで型名をクリックした時にObjective-Cのコード内で`NS_OPTIONS`マクロで定義されているenum値については、「整数の0を与えると、どのオプションも指定しないことを表す」と覚えておけばいいでしょう。(どのオプションも指定しないことがクラスリファレンス等で明確に禁止されていない限り)安心して「0は何も指定しないだけ」と思って大丈夫です。