2014-10-08 110 views
0

下面的代碼有什麼作用?三元運算符在'如果'條件下沒有任何內容

return obj ? : [NSNull null]; 

從我的三元運作的理解,將等同於:

if (!obj) 
    return [NSNull null]; 

但什麼獲取返回if (obj)?它是否仍然通過return [NSNull null]

+0

這是一個非標準的GNU擴展 - 請參閱:http://stackoverflow.com/questions/12420144/how-wide-spread-is-this-gnu-extension-on-ternary-operation – 2014-10-08 13:37:28

回答

3

代碼...

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; 

本質受益,如果驗證對象與真實的返回對象相同,則使用縮短的版本。

3

如果objTrue,則返回obj

return obj ? : [NSNull null]; 

等同於:

id x = obj; 
if (x) { 
    return x; 
else { 
    return [NSNull null]; 
} 

只要OBJ沒有副作用這是邏輯上等同於:

return obj ? obj : [NSNull null] 
+1

所以它是相同的作爲'return obj? obj:[NSNull null]'? – 2014-10-08 13:34:31

+0

是的,正好。我將補充說明供參考。 – 2014-10-08 13:35:56

+1

是的,但它只需要對對象進行一次檢查。想想如果這是一個昂貴的函數返回一個布爾值。註釋中的方法將運行兩次函數。 – Fogmeister 2014-10-08 13:36:39