Dòng mã này có ý nghĩa gì?
label.frame = (inPseudoEditMode) ? kLabelIndentedRect : kLabelRect;
Các ?
và :
nhầm lẫn tôi.
variable ?: anotherVariable
, điều này có nghĩa là gì? '
(valOrVar != 0) ? valOrVar : anotherValorvar
Dòng mã này có ý nghĩa gì?
label.frame = (inPseudoEditMode) ? kLabelIndentedRect : kLabelRect;
Các ?
và :
nhầm lẫn tôi.
variable ?: anotherVariable
, điều này có nghĩa là gì? '
(valOrVar != 0) ? valOrVar : anotherValorvar
Câu trả lời:
Đây là toán tử ternary C (Objective-C là siêu bộ của C):
label.frame = (inPseudoEditMode) ? kLabelIndentedRect : kLabelRect;
tương đương về mặt ngữ nghĩa với
if(inPseudoEditMode) {
label.frame = kLabelIndentedRect;
} else {
label.frame = kLabelRect;
}
Ternary không có phần tử đầu tiên (ví dụ variable ?: anotherVariable
) có nghĩa giống như(valOrVar != 0) ? valOrVar : anotherValOrVar
?:
) thậm chí còn tốt hơn trong các tình huống trong đó phía bên trái là một biểu thức, vì ?:
điều đó ngăn nó được đánh giá nhiều lần. Ví dụ: [myArray firstObject] ? [myArray firstObject] : @"Hello World";
gọi firstObject
hai lần (nếu firstObject
không trả về nil
), trong đó [myArray firstObject] ?: @"Hello World";
tạo ra kết quả giống hệt nhau nhưng không bao giờ gọi firstObject
nhiều hơn một lần.
?:
cũng được gọi là toán tử Elvis do biểu tượng cảm xúc giống với ca sĩ. Và tất nhiên trong trường hợp này khi chúng ta bỏ một phần tử, nó không còn là toán tử ternary mà là toán tử nhị phân . Khai thác nhị phân bao gồm đại đa số các nhà khai thác chúng ta thường sử dụng khi lập trình ( *
, +
, -
, ^
, |
, ||
, &
, >>
, vv).
Đơn giản, logic sẽ là
(condition) ? {code for YES} : {code for NO}
Dựa trên lời giải thích tuyệt vời của Barry Wark ...
Điều quan trọng về toán tử ternary là nó có thể được sử dụng ở những nơi mà nếu không thì không thể. tức là: Bên trong một tham số điều kiện hoặc phương thức.
[NSString stringWithFormat: @"Status: %@", (statusBool ? @"Approved" : @"Rejected")]
... đó là một cách sử dụng tuyệt vời cho các hằng tiền xử lý:
// in your pch file...
#define statusString (statusBool ? @"Approved" : @"Rejected")
// in your m file...
[NSString stringWithFormat: @"Status: %@", statusString]
Điều này giúp bạn không phải sử dụng và giải phóng các biến cục bộ trong các mẫu if-other. FTW!
Đó chỉ là toán tử ternary thông thường . Nếu phần trước dấu chấm hỏi là đúng, nó sẽ đánh giá và trả về phần trước dấu hai chấm, nếu không, nó sẽ đánh giá và trả về phần sau dấu hai chấm.
a?b:c
giống như
if(a)
b;
else
c;
Nó chỉ là một hình thức ngắn để viết một câu lệnh if-then-other. Nó có nghĩa giống như mã sau đây:
if(inPseudoEditMode)
label.frame = kLabelIndentedRect;
else
label.frame = kLabelRect;
Ví dụ về toán tử ternary. Nếu giá trị của biến boolean isF Gay là CÓ, hãy in "GENDER IS FEMALE" nếu không "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.
Mục tiêu-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.
Dành cho 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.
Thực tế thú vị, trong object-c nếu bạn muốn kiểm tra null / nil Ví dụ:
-(NSString*) getSomeStringSafeCheck
{
NSString *string = [self getSomeString];
if(string != nil){
return String;
}
return @"";
}
Cách nhanh chóng để làm điều đó là:
-(NSString*) getSomeStringSafeCheck
{
return [self getSomeString] != nil ? [self getSomeString] : @"";
}
Sau đó, bạn có thể cập nhật nó theo cách đơn giản nhất:
-(NSString*) getSomeStringSafeCheck
{
return [self getSomeString]?: @"";
}
Bởi vì trong Mục tiêu-C:
Vì vậy, hãy nói rằng bạn viết:
[self getSomeString] != nil?: @"";
tham số thứ hai đang trả về giá trị boolean, do đó, một ngoại lệ được đưa ra.
Nó là toán tử ternary, giống như một câu lệnh if / other.
if(a > b) {
what to do;
}
else {
what to do;
}
Trong toán tử ternary nó là như thế: điều kiện? Phải làm gì nếu điều kiện là đúng: phải làm gì nếu nó sai;
(a > b) ? what to do if true : what to do if false;
Tôi vừa học được một cái gì đó mới về toán tử ternary. Các hình thức ngắn mà bỏ qua toán hạng giữa là thực sự thanh lịch, và là một trong nhiều lý do mà C vẫn còn có liên quan. FYI, lần đầu tiên tôi thực sự hiểu được vấn đề này trong bối cảnh một thói quen được thực hiện trong C #, cũng hỗ trợ nhà điều hành ternary. Vì toán tử ternary nằm trong C, nên có lý do rằng nó sẽ ở các ngôn ngữ khác về cơ bản là các phần mở rộng của chúng (ví dụ: Objective-C, C #).
Như mọi người đã đề cập, đó là một cách đại diện cho toán tử có điều kiện
if (condition){
true
}
else {
false
}
bằng cách sử dụng toán tử ternary (condition)? true:false
Để thêm thông tin bổ sung, trong swift chúng tôi có cách biểu diễn mới bằng cách sử dụng nó ??
.
let imageObject: UIImage = (UIImage(named: "ImageName")) ?? (initialOfUsername.capitalizedString).imageFromString
Tương tự như
int a = 6, c= 5;
if (a > c)
{
a is greater
} else {
c is greater
}
tương đương với
if (a>c)?a:c
==> Bằng với if (a>c)?:c
thay vì ?:
chúng ta có thể sử dụng ??
là nhanh chóng.