疑問符とコロン(?:三項演算子)は、objective-cで何を意味しますか?


270

このコード行はどういう意味ですか?

label.frame = (inPseudoEditMode) ? kLabelIndentedRect : kLabelRect;

?そして:私を混乱させる。


1
これは、3項のif-then-else演算子です
クラウスビスコフペデルセン2010

3
これは引用符ではなく疑問符である必要があることに注意してください。
クラヘイ

6
コンパイラもを許可variable ?: anotherVariableしているようですが、これはどういう意味ですか?」
Tony

15
最初の要素のない3項は次と同じことを意味します(valOrVar != 0) ? valOrVar : anotherValorvar
Scott Lahteine 2012年

回答:


430

これはC 三項演算子です(Objective-CはCのスーパーセットです)。

label.frame = (inPseudoEditMode) ? kLabelIndentedRect : kLabelRect;

意味的には

if(inPseudoEditMode) {
 label.frame = kLabelIndentedRect;
} else {
 label.frame = kLabelRect;
}

最初の要素のない三項(例:)variable ?: anotherVariableは、(valOrVar != 0) ? valOrVar : anotherValOrVar


28
(更新:Yuck!回答としての再投稿。)三項演算子について非常に重要なことは、if-elseが使用できない場所で使用できることです。つまり、条件またはメソッドパラメータの内部。[NSString stringWithFormat:@ "Status:%@"、(statusBool?@ "Approved":@ "Rejected")] ...これは、プリプロセッサ定数の優れた用途です。#define statusString(statusBool?@ "Approved":@ "Rejected")... then:[NSString stringWithFormat:@ "Status:%@"、statusString]これにより、if-elseパターンでローカル変数を使用および解放する必要がなくなります。FTW!
ブルーノブロノスキー

42
最初の要素(?:)のない3項演算子は、左側が式である場合、式が2回以上評価されるのを防ぐため、さらに優れていることはおそらく言及する価値があります?:。たとえば、2回[myArray firstObject] ? [myArray firstObject] : @"Hello World";呼び出しますfirstObjectfirstObjectが返されない場合nil)。[myArray firstObject] ?: @"Hello World";同じ結果が生成されますfirstObjectが、2回以上呼び出されることはありません。
nhgrif 14

最後に~~~~~私はこの演算子を長い間使用しています(お気に入りのデフォ)が、それが何と呼ばれるかを知りません。大きな問題が解決されました。ありがとう
Thang Do

また、最初の要素のない3項演算子?:は、歌手に似た絵文字であるため、Elvis演算子とも呼ばれます。そしてもちろん、この場合、1つの要素を削除しているため、3項演算子ではなく2項演算子になります。バイナリ演算子は(プログラミングするとき、我々は通常、使用事業者の大多数含まれ、、、、、、、、など)。*+-^|||&>>
tomacco 2018

179

これは、3項演算子または条件付き演算子です。基本的な形式は次のとおりです。

condition ? valueIfTrue : valueIfFalse

値が選択された場合にのみ評価されます。


8
明確にするために、それは値に限定されていません。condition ? codeIfTrue : codeIfFalse
マイクS

46

単に、ロジックは

(condition) ? {code for YES} : {code for NO}


4
他の回答は結果として「値」しか持てないことを暗示しているため、これは実際には最良の回答です。これは、結果として任意のコードを置くことができることを示しています。
マイクS

36

バリーワークの優れた説明に基づいて...

三項演算子について非常に重要なのは、if-elseでは使用できない場所で使用できることです。つまり、条件またはメソッドパラメータの内部。

[NSString stringWithFormat: @"Status: %@", (statusBool ? @"Approved" : @"Rejected")]

...これはプリプロセッサ定数の優れた用途です。

// in your pch file...
#define statusString (statusBool ? @"Approved" : @"Rejected")

// in your m file...
[NSString stringWithFormat: @"Status: %@", statusString]

これにより、if-elseパターンでローカル変数を使用および解放する必要がなくなります。FTW!


14

これは通常の三項演算子です。疑問符の前の部分がtrueの場合は、コロンの前の部分を評価して返します。それ以外の場合は、コロンの後ろの部分を評価して返します。

a?b:c

のようなものです

if(a)
    b;
else
    c;

4

これはCの一部であるため、Objective-C固有ではありません。これがifステートメントへの翻訳です:

if (inPseudoEditMode)
    label.frame = kLabelIndentedRec;
else
    label.frame = kLabelRect;

4

これは、if-then-elseステートメントを記述する短い形式にすぎません。次のコードと同じ意味です。

if(inPseudoEditMode)
  label.frame = kLabelIndentedRect;
else
  label.frame = kLabelRect;

2

3項演算子の例。isFemaleブール変数の値がYESの場合、「GENDER IS FEMALE」と出力します。それ以外の場合、「GENDER IS MALE」と出力します。

? means = execute the codes before the : if the condition is true. 
: means = execute the codes after the : if the condition is false.

Objective-C

BOOL isFemale = YES;
NSString *valueToPrint = (isFemale == YES) ? @"GENDER IS FEMALE" : @"GENDER IS MALE";
NSLog(valueToPrint); //Result will be "GENDER IS FEMALE" because the value of isFemale was set to YES.

Swiftの場合

let isFemale = false
let valueToPrint:String = (isFemale == true) ? "GENDER IS FEMALE" : "GENDER IS MALE"
print(valueToPrint) //Result will be  "GENDER IS MALE" because the isFemale value was set to false.

2

面白い事実、null / nilをチェックしたい場合はobjective-cで以下に例を示します。

-(NSString*) getSomeStringSafeCheck
{
    NSString *string = [self getSomeString];
    if(string != nil){
        return String;
    }
    return @"";
}

簡単な方法は次のとおりです。

-(NSString*) getSomeStringSafeCheck
{
    return [self getSomeString] != nil ? [self getSomeString] : @"";
}

次に、それを最も簡単な方法に更新できます。

-(NSString*) getSomeStringSafeCheck
{
    return [self getSomeString]?: @"";
}

Objective-Cでは:

  1. オブジェクトがnilの場合、ブール値としてfalseを返します。
  2. 三項演算子の2番目のパラメーターは、「?」の左側に結果を返すため、空にすることができます。

だからあなたが書くとしましょう:

[self getSomeString] != nil?: @"";

2番目のパラメーターはブール値を返すため、例外がスローされます。


1

これは、if / elseステートメントのような3項演算子です。

if(a > b) {
what to do;
}
else {
what to do;
}

三項演算子では、次のようになります。条件?条件がtrueの場合の処理​​:falseの場合の処理​​。

(a > b) ? what to do if true : what to do if false;

2
あなたがサイトに貢献しようとしていることを感謝しますが、他の回答がすでに述べていることを単純に繰り返す回答を投稿することは、質問を散らかすだけなので、一般的には推奨されません。
Chris Hayes

1

三項演算子について何か新しいことを学びました。中央のオペランドを省略した短い形式は本当にエレガントで、Cが関連し続ける多くの理由の1つです。ちなみに、私はC#で実装されたルーチンのコンテキストでこれに本当に頭を抱えました。これは、3項演算子もサポートしています。三項演算子はCであるため、本質的にその拡張機能である他の言語(たとえば、Objective-C、C#)で使用されることになります。


1

誰もが言及したように、それは条件付き演算子を表す方法です

if (condition){ 
    true 
} 
else {
    false
}

三項演算子の使用(condition)? true:false 追加情報を追加するには、迅速に、を使用してそれを表す新しい方法があり??ます。

let imageObject: UIImage = (UIImage(named: "ImageName")) ?? (initialOfUsername.capitalizedString).imageFromString

に似ています

int a = 6, c= 5;
if (a > c) 
{ 
 a is greater
} else {
 c is greater
}

に相当

if (a>c)?a:c ==>等しい if (a>c)?:c

の代わりに ?:使用できる??迅速です。


1
int padding = ([[UIScreen mainScreen] bounds].size.height <= 480) ? 15 : 55;

手段

int padding; 
if ([[UIScreen mainScreen] bounds].size.height <= 480)
  padding = 15;
else
  padding = 55; 
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.