objective-c에서 물음표와 콜론 (? : 삼항 연산자)은 무엇을 의미합니까?


270

이 코드 줄은 무엇을 의미합니까?

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

?과는 :나를 혼란스럽게.



3
인용 부호가 아닌 물음표 여야합니다.
clahey

6
컴파일러는 또한 허용하는 것 같습니다 variable ?: anotherVariable. 이것이 무엇을 의미합니까? '
Tony

15
첫 번째 요소가없는 삼항은 다음과 같은 의미입니다.(valOrVar != 0) ? valOrVar : anotherValorvar
Scott Lahteine

답변:


430

이것은 C 삼항 연산자입니다 (Objective-C는 C의 수퍼 세트입니다).

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

의미 적으로

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

첫 번째 요소가없는 3 원 (예 :) variable ?: anotherVariable(valOrVar != 0) ? valOrVar : anotherValOrVar


28
(업데이트 : Yuck! 답변으로 다시 게시) 삼항 연산자에서 중요한 것은 if-else가 할 수없는 곳에서 사용할 수 있다는 것입니다. 즉 : 조건 또는 메서드 매개 변수 내부 [NSString stringWithFormat : @ "Status : % @", (statusBool? @ "Approved": @ "Rejected")] ... 전 처리기 상수에 많이 사용됩니다. #define statusString (statusBool? @ "Approved": @ "거부 됨") ... 다음 : [NSString stringWithFormat : @ "상태 : % @", statusString] 로컬 변수를 if-else 패턴으로 사용하고 해제 할 필요가 없습니다. FTW!
Bruno Bronosky

42
첫 번째 요소 ( ?:)가 없는 삼항 연산자 는 왼쪽이 표현식 인 상황에서 훨씬 우수 하다는 점을 언급 할 가치가 ?:있습니다. 예를 들어, 두 번 [myArray firstObject] ? [myArray firstObject] : @"Hello World";호출 firstObject하면 ( firstObject리턴하지 않으면 nil) [myArray firstObject] ?: @"Hello World";동일한 결과 가 생성되지만 firstObject두 번 이상 호출하지 않습니다 .
nhgrif

마지막으로 ~~~~~ 나는이 연산자를 여러 해 동안 (내 마음에 드는 것 제거) 사용했지만 그것이 무엇인지 알지 못했습니다. 큰 질문은 이제 답변되었습니다. 감사합니다
Thang Do

또한 첫 번째 요소 ?:가 없는 3 항 연산자 는 가수와 의 이모티콘 과 유사하기 때문에 Elvis 연산자 라고도합니다 . 물론이 경우 하나의 요소를 삭제함에 따라 더 이상 삼항 연산자가 아니라 이항 연산자 입니다. 바이너리 연산자는 프로그래밍 할 때 우리가 일반적으로 (사용 사업자의 대부분을 포함 , , , , , , , , 등). *+-^|||&>>
tomacco

179

삼항 또는 조건부 연산자입니다. 기본 형식은 다음과 같습니다.

condition ? valueIfTrue : valueIfFalse

값이 선택된 경우에만 평가됩니다.


8
명확히하기 위해, 그것은 가치에 국한되지 않습니다. condition ? codeIfTrue : codeIfFalse
Mike S

46

간단히 말해서 논리는

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


4
다른 답변은 결과로 "값"만 가질 수 있다는 것을 암시하기 때문에 실제로 가장 좋은 대답입니다. 반면에 임의의 코드를 결과로 넣을 수 있음을 보여줍니다.
Mike 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

삼항 연산자 예. 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.

목표 -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.

스위프트

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

재미있는 사실, objective-c에서 null / nil을 확인하려는 경우 예를 들면 다음과 같습니다.

-(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를 boolean으로 반환합니다.
  2. 삼항 연산자의 두 번째 매개 변수는 '?'왼쪽에 결과를 리턴하므로 비어있을 수 있습니다.

따라서 다음과 같이 작성하십시오.

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

두 번째 매개 변수는 부울 값을 반환하므로 예외가 발생합니다.


1

if / else 문과 같이 삼항 연산자입니다.

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

삼항 연산자에서 다음과 같습니다. condition? 조건이 참인 경우해야 할 일 : 거짓 인 경우해야 할 일;

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

2
사이트에 기여하려고 노력하고 있지만 다른 답변에서 이미 언급 한 내용을 반복하는 답변을 게시하면 질문이 복잡해 지므로 일반적으로 권장하지 않습니다.
Chris Hayes

1

방금 삼항 연산자에 대해 새로운 것을 배웠습니다. 중간 피연산자를 생략하는 짧은 형식은 진정으로 우아하며 C가 관련성을 유지하는 많은 이유 중 하나입니다. 참고로, C #으로 구현 된 루틴의 맥락 에서이 문제를 해결하기 위해 실제로 삼진 연산자를 지원합니다. 삼항 연산자는 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.