2014-01-13 713 views
5

例如,@(...)是什麼意思?

CABasicAnimation *rotate = [CABasicAnimation animationWithKeyPath:@"transform.rotation"]; 
[rotate setToValue:@(M_PI)]; 
[rotate setDuration:0.1f];    
[[aView layer] addAnimation:rotate forKey:@"myRotationAnimation"]; 

其中M_PI被定義爲在math.h一個宏,

#define M_PI 3.14159265358979323846264338327950288 /* pi */ 
+0

@(M_PI)是一個NSNumber的在這種情況下 – johnMa

+3

@johnMa事實上,@前綴(表達),其中@後跟圓括號中,將永遠是一個數吧?方括號=數組,花括號=字典。 –

回答

5

這是一個指向NSNumber對象。這就是所謂的一個盒裝文字,因爲心理畫面是把表達的原始值內成爲一個「盒子」,也就是對象的。

official documentation如果有疑問。請注意,指針可以是一個「真正的」 NSNumber對象,也可以(從理論上說,不知道這是否會在實際工作)是標記指針(參見,例如,my question)。

請注意,您也可以執行諸如@"string"@5之類的操作,它將在編譯時創建常量。但是你需要括號來使用非文字的東西,例如@(2 + 3)。括號表單可以用於任何表達式,即使那些編譯器在編譯時不能計算的表達式(儘管它可以,它只會將表達式結果放入代碼中)。

1

它表示ID對象

,可以使用任何表達它或返回任何目的。

語法:@(<#expression#>)它會返回id對象。

所以在你的情況下,它會返回NSNumber對象到setToValue方法。

+0

有沒有這樣的事情'ID'對象;根據定義,任何對象都有一個類。 –

+0

@ilyan。 : 不同意。 –

+1

「一個id類型可以容納任何對象的指針」我相信會是一個更好的表達。同樣,'@(something)'構造只會創建'NSNumber'實例。 –

1

這是速記書寫

在Objective-C,任何characternumericboolean文字與'@'字符前綴將評估爲一個指向NSNumber object(在這種情況下),用該值進行初始化。 C的類型後綴可以用來控制文字的大小。

'@'在Objective-C世界中被廣泛使用。它主要用於避免使用英文單詞並保留它們(例如,在C/Objective-C中不能使用名爲float的變量,因爲這是一個保留字)。使用this link To have detailed knowledge of '@' symbol

在現代物鏡C中,'@'符號被廣泛使用。

什麼,你可以用它做什麼:

  • 計算表達式:@(<Expression>)
  • 包裝在同樣的方式

原因如int,BOOL,浮法,字符的任意值使用方法:

  • 易於編寫,需要較少的代碼
  • 錯誤的機會較少。將[NSNumber numberWithInt:3]@3進行比較。
  • 擺脫簡單情況下的類型轉換問題。
+0

小調:這不是以'@'作爲前綴的前綴。文字就像'@ 3.14'。這是盒裝表達。這就是爲什麼它需要括號。 –

+0

@ilyan。是的。但我試圖給出一個通用的答案。我打算告訴PO爲什麼在Objective C中使用了'@'符號。所以我從Literals開始,並以表達式結束。讓我知道如果我錯了。 –

+0

它不需要括號,@ilya;嘗試一下。 '@ M_PI'編譯得很好,因爲預處理器在編譯器到達之前已經將文字寫入了。如果它是一個變量而不是一個宏,則需要使用圓括號。 –

5

NeXT和Apple Obj-C運行時長期以來一直使用文字語法@"a new string"來創建新字符串。使用這種格式可以讓程序員在做某些操作時不必使用更長的initWithString或類似的方法。

使用Apple LLVM編譯器時4。0或更高版本,數組,字典和數字(NSArray,NSDictionary,NSNumber類)也可以使用文字語法而不是方法創建。文字語法使用@符號與[],{},()結合分別創建上述類。

所以,基本上它不僅爲idNSNumber對象!

感謝wiki

+0

只是想補充'@「字符串」'是在編譯時創建'NSString'字面值的結構; '@(表達式)'或者'@ [items]'框在運行時。 –