2012-01-12 10 views
1

投稿リクエストを作成する方法があります。そのリクエストにはx個のパラメータがあるかもしれませんが、どれも必須ではありません。 boolean型のパラメータがあります(これらは、値が "true"または "false"の文字列として渡されます(私の判断ではなく、APIです)。ブール値ではfalseと違うヌルはありますか?

ここに問題があります。メソッドの宣言には、ポスト要求の一部として受け入れた。問題は、その要求がブール・パラメータがtrueの場合、異なる結果を返す偽であるか、それが存在しないということである。

-(void) createRequestWithID:(NSString *)id translate(NSNumber *)translate onlyLastVersions:(NSNumber *)onlyLastVersions 

私の方法のように私のメソッドIDの何か他の開発者が使用して呼び出すフレームワークの一部です。つまり、パラメータに渡すものを制御することはできません(私はラッパーとしてNSNumberを使用します)ブール値です。

ここに問題があります。メソッドがpasingと呼ばれているかどうかを、true、falseまたはnilと解釈できるかどうかを確認する必要があります。そのような場合、私はtranslate = "true"、translate = "false"、または翻訳中のリクエストがリクエストに含まれないためです。

true、false、nilを区別する方法が必要です。

GBDでのテスト私が手にそれをdifferenciateする方法を見つけるためにしようとする:

(GDB)のp translateFALSE $ = 5(のNSNumber *)を0x0

(GDB)のp translateNIL $ 6 =(のNSNumber *)0x0

(gdb)po translateFALSE NILオブジェクトの説明を印刷できません。

(gdb)po translateNIL NILオブジェクトの説明を印刷できません。

(gdb)po [translateFALSE class] NILオブジェクトの説明を印刷できません。

(gdb)po [translateNIL class] NILオブジェクトの説明を印刷できません。

だから、私はそれをする方法がありません。

+0

それと私の2つのコード例があります。オブジェクトを 'false'に設定することはできません。これは' nil'に設定することと同じです。あなたはデバッグ出力でそのことがわかります。オブジェクトポインタは0x0 - NULLを指しています。数字を作るための 'NSNumber'のドキュメントを見てください。しかし、あなたは* NSNumber * n = [NSNumber numberWithBool:NO];' –

答えて

3
if(translate) { 
    if([translate boolValue]) { 
    // translate is present and is set (YES) 
    } else { 
    // translate is present and is not set (NO) 
    } 
} else { 
    // translate is nil/not present 
} 

をあなたはより多くの3ウェイ枝のように、この外観を持っていることを好む場合:以下のすべての3つの答えがどのように説明し

if([translate boolValue]) { 
    // translate is present and is set (YES) 
} else if(translate) { 
    // translate is present and is not set (NO) 
} else { 
    // translate is nil/not present 
} 
+0

nilがfalseと評価され、したがってNSNumberであっても、開発者がfalseを渡すとオブジェクトはnilと評価されるため、動作しません。 とにかく、(translate = nilと= falseで)このコードを確認しました: NSNumber * translates = nil; if([translates boolValue]){ NSLog(@ "YES"); } else if(翻訳){ NSLog(@ "NO"); } else { NSLog(@ "NIL"); } } どちらの場合も、出力はNIL – yowie

+0

@yowieでした。オブジェクトポインタを 'false'に設定することはできません。まず、あなたのコンパイラは、キャストなしでポインタに整数をキャストすることについて不平を言っているはずです。次に、このようにする必要があります: 'NSNumber * translate = [NSNumber numberWithBool:NO];'それは中間ブロックを評価します。 –

+0

@yowieあなたのフレームワークを設計するには...プログラマーに、nilを渡すことはその機能を全く設定したくないことを意味し、 'NSNumber'オブジェクトを' false'にセットすることは、 。開発者にAPIを適切に使用する方法を伝えることはあなた次第であり、実際に正しく使用するかどうかはあなたの責任です。あなたが非常に心配しているなら、まっすぐなオブジェクトを渡すのではなく、オプション辞書を取る。ユーザーが翻訳のためにキーを設定しない場合、ユーザーはそれを気にしません。 –

1

ブール値にNULL(またはnil)というようなものはありません。NULLはポインタ値です。 NSNumberはnilでもかまいませんが、BOOL NOを表すNSNumberはゼロになりません。

+0

のような数字を作成しなければなりません。 GBDは、NSNumberにnilまたはfalseを渡すと同じ結果になり、それが私の問題であることを示しています。私がメソッドを呼び出す場合、私は間違いなくNSNumberオブジェクトを渡すでしょうが、他の開発者はそれを呼び出すでしょうし、ちょうどfalseを渡すかもしれません。 – yowie

1

NSNumberを渡している場合は、それがオブジェクトです。オブジェクトを持つかどうかを区別することができます。 (あなたがオブジェクトの値を抽出しようとすると、この前に行います。)

+0

問題は、このメソッドが他の開発者によって呼び出されていることです。もしfalseを渡すならば、コンパイラは文句を言わないでしょうが、translate = "false"を含むリクエストが必要なためにfalseを渡すか、パラメータtranslateなしでリクエストが必要なのでnilを渡します。問題は、リクエストでパラメータを無視するか、偽にする必要があるかどうかを知るために、falseまたはnilを渡す開発者を区別できないことです。 – yowie

+0

@yowie - あなたの要件を理解できません。 NSNumber値を指定したい場合はtrueまたはfalse、そうでない場合はnil。オブジェクトの値を参照しようとする前にnilをテストする –

+0

これは私の最初のアイデアでしたが、falseまたはnilのテストは同じように動作します。 :if(translate == false)はif(translate == nil)と同じように振る舞います。それは問題です – yowie

関連する問題