Objective-C基本數(shù)據(jù)類(lèi)型
因?yàn)镺bjective-C(下稱(chēng)ObjC)本質(zhì)是一個(gè)C語(yǔ)言的超集贸营,所以所有C語(yǔ)言支持的基本數(shù)據(jù)類(lèi)型,ObjC同樣支持狐榔,并且ObjC還支持一些其它的常用數(shù)據(jù)類(lèi)型键俱。
int 與 NSInteger
C語(yǔ)言中的int,在ObjC中同樣支持搪柑,但不建議你用int聋丝,而推薦使用Cocoa框架中的NSInteger,
詳見(jiàn)NSInteger定義
#if __LP64__ || (TARGET_OS_EMBEDDED && !TARGET_OS_IPHONE) || TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64
typedef long NSInteger;
typedef unsigned long NSUInteger;
#else
typedef int NSInteger;
typedef unsigned int NSUInteger;
#endif
注意工碾,這里主要是為了同時(shí)匹配64位和32位處理器弱睦,在上面官方框架的代碼中我們看到,64位內(nèi)核中NSInteger為long型渊额,而在32位內(nèi)核中為int型况木,使用NSInteger,就不用特意去考慮內(nèi)核位寬問(wèn)題旬迹。
bool 與 BOOL
C語(yǔ)言標(biāo)準(zhǔn)中沒(méi)有布爾型變量火惊,C++中的bool類(lèi)型,為true和false奔垦,這在許多其他的類(lèi)C語(yǔ)言中都是一樣的屹耐,例如java、C#椿猎、php等惶岭,但在ObjC中,你可以使用bool類(lèi)型鸵贬,但更建議使用ObjC專(zhuān)用的BOOL類(lèi)型俗他,這個(gè)基本布爾型的值為YES和NO。
float 與 CGFloat
CGFloat 不是Foundation框架的基礎(chǔ)變量阔逼,而是定義在UIKit框架中兆衅,CG代表CoreGraphic(核心繪圖框架)。從定義來(lái)看嗜浮,float和CGFloat的區(qū)別也是根據(jù)系統(tǒng)內(nèi)核位寬不同羡亩,類(lèi)型不同。
#if defined(__LP64__) && __LP64__
# define CGFLOAT_TYPE double
# define CGFLOAT_IS_DOUBLE 1
# define CGFLOAT_MIN DBL_MIN
# define CGFLOAT_MAX DBL_MAX
#else
# define CGFLOAT_TYPE float
# define CGFLOAT_IS_DOUBLE 0
# define CGFLOAT_MIN FLT_MIN
# define CGFLOAT_MAX FLT_MAX
#endif
/* Definition of the `CGFloat' type and `CGFLOAT_DEFINED'. */
typedef CGFLOAT_TYPE CGFloat;
可以看到危融,64位中CGFloat是double類(lèi)型畏铆,32位中則是float類(lèi)型。
NSString
char和string類(lèi)型在ObjC中同樣可用吉殃,但是基本也可以不用辞居。NSString作為整個(gè)Cocoa框架的靈魂類(lèi)楷怒,強(qiáng)大無(wú)比,基本能勝任現(xiàn)代編程語(yǔ)言對(duì)于字符串的所有基本處理和更復(fù)雜的處理瓦灶。詳細(xì)使用方法將在后面專(zhuān)門(mén)章節(jié)介紹鸠删。
NSString類(lèi),不需要alloc和init贼陶,Cocoa框架高度優(yōu)化了NSString類(lèi)刃泡,讓他在實(shí)例化時(shí)操作起來(lái)就好像基本類(lèi)型一樣。例如
NSString* textA = @"123";
NSString* textB = textA;
textA = @"456";
NSLog(@"%@",textA); //輸出 456
NSLog(@"%@",textB); //輸出 123
注意到?jīng)]有碉怔,按道理說(shuō)將textB指針指向textA以后烘贴,textA值改變,textB應(yīng)該也跟著變撮胧。但實(shí)際情況并沒(méi)有桨踪,這是因?yàn)閷?duì)于NSString類(lèi)型來(lái)說(shuō),等號(hào)賦值趴樱,實(shí)際是深度拷貝馒闷。textA=@"456"這一步textA的指針已經(jīng)改變酪捡,實(shí)際操作等同于 textA = [@"456" copy]叁征。
textB = textA,實(shí)際操作等同于 textB = [textA copy]逛薇。
這里的copy函數(shù)捺疼,是NSObject的不可變拷貝方法。
另外NSString類(lèi)永罚,本身支持與許多基本類(lèi)型的互轉(zhuǎn)啤呼。
//CGPoint 點(diǎn)轉(zhuǎn)字符串
NSString *NSStringFromCGPoint(CGPoint point);
//CGVector 向量轉(zhuǎn)字符串
NSString *NSStringFromCGVector(CGVector vector);
//CGSize 大小轉(zhuǎn)字符串
NSString *NSStringFromCGSize(CGSize size);
//矩形轉(zhuǎn)字符串
NSString *NSStringFromCGRect(CGRect rect);
//矩陣變換轉(zhuǎn)字符串
NSString *NSStringFromCGAffineTransform(CGAffineTransform transform);
//邊界轉(zhuǎn)字符串
NSString *NSStringFromUIEdgeInsets(UIEdgeInsets insets);
//位移轉(zhuǎn)字符串
NSString *NSStringFromUIOffset(UIOffset offset);
//上面的逆向方法
CGPoint CGPointFromString(NSString *string);
CGVector CGVectorFromString(NSString *string);
CGSize CGSizeFromString(NSString *string);
CGRect CGRectFromString(NSString *string);
CGAffineTransform CGAffineTransformFromString(NSString *string);
UIEdgeInsets UIEdgeInsetsFromString(NSString *string);
UIOffset UIOffsetFromString(NSString *string);
注意所有上面的互轉(zhuǎn)方法都是C函數(shù),可以在任何地方調(diào)用呢袱。
CG系列的基本類(lèi)型官扣,則是使用C語(yǔ)言的結(jié)構(gòu)體聲明的。
另外NSString也可以轉(zhuǎn)數(shù)字
NSString* number = @"1111113";
NSInteger intValue = [number integerValue]; //轉(zhuǎn)整形
CGFloat floatValue = [number doubleValue]; //轉(zhuǎn)浮點(diǎn)
NSValue
NSValue是個(gè)可以和各種基本數(shù)據(jù)類(lèi)型互轉(zhuǎn)的類(lèi)羞福。包括CGPoint惕蹄、CGRect、CGSize等等治专。例如
[NSValue valueWithCGSize:CGSizeMake(100, 100)];
[NSValue valueWithRange:NSMakeRange(0, 10)];
NSNumber
NSNumber與上面不同的是卖陵,NSNumber不是基本數(shù)據(jù)類(lèi)型,而是對(duì)象张峰。
NSNumber 繼承自 NSValue泪蔫,而NSValue繼承自NSObject。
NSNumber支持和基本數(shù)據(jù)類(lèi)型的互轉(zhuǎn)喘批。
另外NSNumber支持和NSString一樣的@
符號(hào)簡(jiǎn)寫(xiě)
NSNumber * number = @(123);
NSNumber * number1 = @(3.1415);
NSNumber * number2 = @(YES);
NSInteger intValue = [number integerValue];
CGFloat floatValue = [number1 doubleValue];
BOOL boolValue = [number2 boolValue];
數(shù)組
在C和C++中常用的基本類(lèi)型數(shù)組撩荣,在ObjC中對(duì)應(yīng)的是NSArray類(lèi)铣揉,這個(gè)類(lèi)中存儲(chǔ)的數(shù)據(jù),也必須是類(lèi)餐曹,而不能是基本數(shù)據(jù)類(lèi)型老速,所以要將基本數(shù)據(jù)類(lèi)型轉(zhuǎn)換成對(duì)象存儲(chǔ),例如
//注意這里用@[]方式返回NSSArray對(duì)象
NSArray* numbers = @[@(1),@(2),@(3)];
這里numbers數(shù)組中存儲(chǔ)了1,2,3三個(gè)NSNumber類(lèi)型數(shù)據(jù)凸主。
在ObjC中二維數(shù)組或多維數(shù)組并不常見(jiàn)橘券,如有需要,建議使用C的數(shù)組進(jìn)行存儲(chǔ)卿吐。
小節(jié)
本章中除了基本數(shù)據(jù)類(lèi)型旁舰,還介紹了部分ObjC的基本容器,例如NSString,NSValue,NSArray等嗡官,這些基本容器是Cocoa框架不可或缺的血液箭窜,貫穿始終。我們將在后面的章節(jié)介紹更多的基本容器衍腥,和他們的基本使用方法磺樱。