從C/C++到Objective-C(一)
? ? ?對(duì)于習(xí)慣了使用C/C++,也多少見識(shí)了Java,Python等編程語言的我,最初看到OC代碼的時(shí)候,真的不得不吐槽啊,這都是些什么東西啊,怎么“-“,”@“,”[ ]",各種符號(hào)到處都是,還是C++代碼看著舒服啊……不過慢慢見得多了后,也就習(xí)慣了,也都是那回事兒嘛。
? ? ?首先明白一點(diǎn),OC也是對(duì)C的擴(kuò)展,在C的基礎(chǔ)上增加了面向?qū)ο?,也就好比C++和C的關(guān)系一樣,只是C++和C是關(guān)系更親密一些罷了。所以,C中的基本語法,類型符,關(guān)鍵詞這些在OC中都是適用的。
? ? ?接下來還是從經(jīng)典的Hello world開始吧:
#importint?main?(int?argc,?const?char?*argv[])
{
????NSLog?(@"Hello?World!");
????return?(0);
}?//?main? ? ?#import 就類似#include,#include也可以用但是基本上也沒有人這樣用,用#import可以防止頭文件重復(fù)包含,而免去了C中的#ifdef等命令。
? ? ?現(xiàn)在就主要看看NSLog (@"Hello world!");這句代碼的,其他的都和c一樣了,當(dāng)然也沒幾句,=.=
? ? ?NSLog()函數(shù)就類似于C中的printf(); 用法也和printf()差不多,可以包含格式說明符和格式說明符對(duì)應(yīng)的參數(shù)。這里NS前綴的用法是為了避免名字沖突,Cocoa給其所有函數(shù),常量,類型名稱都加了NS,所以當(dāng)看到NS開頭的也就知道其實(shí)也就是來自Cocoa工具包中的了。
? ? ?@符號(hào)是OC在標(biāo)準(zhǔn)C語言基礎(chǔ)上添加的特性之一,就和后面會(huì)說到的中括號(hào)[ ]類似,都是OC在C上新添加的特性。@符號(hào)意味著引號(hào)類的字符串是作為Cocoa中的NSString元素來處理的,NSString也就類似C++ std中的String類啦。只是在這里得注意不能將C風(fēng)格的字符串,也就是沒有這個(gè)@符號(hào)的字符串直接傳遞給NSLog(),這樣做編譯器會(huì)給出警告,如果運(yùn)行程序的話可能會(huì)直接奔潰,所以,還是得隨時(shí)知道你是在寫C代碼還是OC代碼。別兩個(gè)搞混在一起了。
? ? ?對(duì)于OC中的布爾類型須記住一點(diǎn),OC中的BOOL類型只有兩個(gè)值YES,NO,其中YES對(duì)應(yīng)的值是1,并且只能是1, 對(duì)于大于1的數(shù)并不能等同于YES,這點(diǎn)和C中是有區(qū)別的,而NO對(duì)應(yīng)的也就是0了。這點(diǎn)在寫程序,執(zhí)行if判斷的時(shí)候得特別注意一下。
? ? ?OC中過程式函數(shù)的書寫和C都是一樣的,看看就懂了,下面來幾個(gè)感受一下:
#import//?returns?NO?if?the?two?integers?have?the?same
//?value,?YES?otherwise
BOOL?areIntsDifferent?(int?thing1,?int?thing2)
{
????if?(thing1?==?thing2)?{
????????return?(NO);
????}?else?{
????????return?(YES);
????}
}?//?areIntsDifferent
//?given?a?YES?value,?return?the?human-readable
//?string?"YES".?Otherwise?return?"NO"
NSString?*boolString?(BOOL?yesNo)
{
????if?(yesNo?==?NO)?{
????????return?(@"NO");
????}?else?{
????????return?(@"YES");
????}
}?//?boolString
int?main?(int?argc,?const?char?*argv[])?
{
????BOOL?areTheyDifferent;
????areTheyDifferent?=?areIntsDifferent?(5,?5);
????NSLog?(@"are?%d?and?%d?different??%@",?
???????????5,?5,?boolString(areTheyDifferent));
????areTheyDifferent?=?areIntsDifferent?(23,?42);
????NSLog?(@"are?%d?and?%d?different??%@",?
???????????23,?42,?boolString(areTheyDifferent));
????return?(0);
}?//?main
引用書籍:《Objective-C 基礎(chǔ)教程(第二版)》





