Objective-C基本數(shù)據(jù)類型

Objective-C基本數(shù)據(jù)類型

因?yàn)镺bjective-C(下稱ObjC)本質(zhì)是一個(gè)C語(yǔ)言的超集,所以所有C語(yǔ)言支持的基本數(shù)據(jù)類型,ObjC同樣支持,并且ObjC還支持一些其它的常用數(shù)據(jù)類型。

int 與 NSInteger

C語(yǔ)言中的int,在ObjC中同樣支持,但不建議你用int,而推薦使用Cocoa框架中的NSInteger,

詳見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類型,為true和false,這在許多其他的類C語(yǔ)言中都是一樣的,例如java、C#、php等,但在ObjC中,你可以使用bool類型,但更建議使用ObjC專用的BOOL類型,這個(gè)基本布爾型的值為YES和NO。

float 與 CGFloat

CGFloat 不是Foundation框架的基礎(chǔ)變量,而是定義在UIKit框架中,CG代表CoreGraphic(核心繪圖框架)。從定義來(lái)看,float和CGFloat的區(qū)別也是根據(jù)系統(tǒng)內(nè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類型,32位中則是float類型。

NSString

char和string類型在ObjC中同樣可用,但是基本也可以不用。NSString作為整個(gè)Cocoa框架的靈魂類,強(qiáng)大無(wú)比,基本能勝任現(xiàn)代編程語(yǔ)言對(duì)于字符串的所有基本處理和更復(fù)雜的處理。詳細(xì)使用方法將在后面專門章節(jié)介紹。

NSString類,不需要alloc和init,Cocoa框架高度優(yōu)化了NSString類,讓他在實(shí)例化時(shí)操作起來(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)說(shuō),等號(hào)賦值,實(shí)際是深度拷貝。textA=@"456"這一步textA的指針已經(jīng)改變,實(shí)際操作等同于 textA = [@"456" copy]。
textB = textA,實(shí)際操作等同于 textB = [textA copy]。
這里的copy函數(shù),是NSObject的不可變拷貝方法。

另外NSString類,本身支持與許多基本類型的互轉(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系列的基本類型,則是使用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ù)類型互轉(zhuǎn)的類。包括CGPoint、CGRect、CGSize等等。例如

[NSValue valueWithCGSize:CGSizeMake(100, 100)];
[NSValue valueWithRange:NSMakeRange(0, 10)];

NSNumber

NSNumber與上面不同的是,NSNumber不是基本數(shù)據(jù)類型,而是對(duì)象。
NSNumber 繼承自 NSValue,而NSValue繼承自NSObject。
NSNumber支持和基本數(shù)據(jù)類型的互轉(zhuǎn)。

另外NSNumber支持和NSString一樣的@符號(hào)簡(jiǎn)寫

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++中常用的基本類型數(shù)組,在ObjC中對(duì)應(yīng)的是NSArray類,這個(gè)類中存儲(chǔ)的數(shù)據(jù),也必須是類,而不能是基本數(shù)據(jù)類型,所以要將基本數(shù)據(jù)類型轉(zhuǎn)換成對(duì)象存儲(chǔ),例如

//注意這里用@[]方式返回NSSArray對(duì)象
NSArray* numbers = @[@(1),@(2),@(3)];

這里numbers數(shù)組中存儲(chǔ)了1,2,3三個(gè)NSNumber類型數(shù)據(jù)。

在ObjC中二維數(shù)組或多維數(shù)組并不常見,如有需要,建議使用C的數(shù)組進(jìn)行存儲(chǔ)。

小節(jié)

本章中除了基本數(shù)據(jù)類型,還介紹了部分ObjC的基本容器,例如NSString,NSValue,NSArray等,這些基本容器是Cocoa框架不可或缺的血液,貫穿始終。我們將在后面的章節(jié)介紹更多的基本容器,和他們的基本使用方法。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容