下面的代碼有什麼作用?三元運算符在'如果'條件下沒有任何內容
return obj ? : [NSNull null];
從我的三元運作的理解,將等同於:
if (!obj)
return [NSNull null];
但什麼獲取返回if (obj)
?它是否仍然通過return [NSNull null]
?
下面的代碼有什麼作用?三元運算符在'如果'條件下沒有任何內容
return obj ? : [NSNull null];
從我的三元運作的理解,將等同於:
if (!obj)
return [NSNull null];
但什麼獲取返回if (obj)
?它是否仍然通過return [NSNull null]
?
代碼...
return foo ? : bar;
將返回與...相同的值
return foo ? foo : bar;
不同之處在於第一種方法只檢查foo
值一次。
在幾種情況下最好使用第一種。
例如,創建一個對象...
// this would create two objects, one to check and the other to return
return [MyObject objectWithSomeParam:param] ? [MyObject objectWithSomeParam:param] : bar;
或運行昂貴的功能...
// the expensive function here is run twice
return [self someExpensiveFunction] ? [self someExpensiveFunction] : bar;
這兩個部分都會使用
return foo ?: bar;
本質受益,如果驗證對象與真實的返回對象相同,則使用縮短的版本。
如果obj
是True
,則返回obj
。
return obj ? : [NSNull null];
等同於:
id x = obj;
if (x) {
return x;
else {
return [NSNull null];
}
只要OBJ沒有副作用這是邏輯上等同於:
return obj ? obj : [NSNull null]
所以它是相同的作爲'return obj? obj:[NSNull null]'? – 2014-10-08 13:34:31
是的,正好。我將補充說明供參考。 – 2014-10-08 13:35:56
是的,但它只需要對對象進行一次檢查。想想如果這是一個昂貴的函數返回一個布爾值。註釋中的方法將運行兩次函數。 – Fogmeister 2014-10-08 13:36:39
這是一個非標準的GNU擴展 - 請參閱:http://stackoverflow.com/questions/12420144/how-wide-spread-is-this-gnu-extension-on-ternary-operation – 2014-10-08 13:37:28