基本数据类型
objective-c兼容c的基本数据类型,包括 int, short, long, double, float, char, bool(这个应该是c++的基本数据类型了)。
objective-c自己的基本数据类型,包括但并不只有 NSInteger, NSNumber, NSString, NSArray, NSSet, NSDictionary。
Tips 1
NSInteger和NSNumber都表示整数,但前者是long的封装,而后者是类。在有些情况下只能使用NSNumber的这种整数类型。
Tips 2
对比一下swift中的基本数据类型:Int, Double, Float, String, Character, Array, Set, Dictionary, Tuple(swift独有数据类型)
Tips 3
在c语言中有void* 这种指针类型,可用于指定任意类型的指针;
相似的,在objective-c中有id类型,这种类型的对象可以转换成任何一种对象;
对比swift,在swift中有AnyObject类型,这种类型的对象也是可以转换成任何一种对象;
NSNumber的常见操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| numberWithInteger numberWithLong numberWithChar numberWithFloat numberWithDouble
NSNumber *intNumber = [NSNumber numberWithInteger:123];
isEqualToNumber compare
NSNumber *number = [[NSNumber alloc] initWithInt:1000];
|
使用NSNumber可以进行装箱和拆箱操作。
装箱:将c语言中的基础数据类型封装到NSNumber类型中,从而使基础数据类型以对象的形式存在。
拆箱:和装箱的操作相反,将NSNumber对象中的基础数据分离出来。
常用装箱操作的方法:
1 2 3 4 5 6 7 8 9 10 11
| +(NSNumber *)numberWithChar:(char)value;
+(NSNumber *)numberWithInt:(int)value;
+(NSNumber *)numberWithFloat:(float)value;
+(NSNumber *)numberWithDouble:(double)value;
+(NSNumber *)numberWithBool:(BOOL)value;
+(NSNumber *)numberWithInteger:(NSInteger)value;
|
常见拆箱操作的方法:
1 2 3 4 5 6 7 8 9
| -(char)charValue
-(int)intValue
-(float)floatValue
-(double)doubleValue
-(BOOL)boolValue
|
除了c语言中的基本数据类型类型外,经常需要进行装箱、拆箱操作的还有结构体,但是结构体的装箱和拆箱不能使用NSNumber类型,而是要使用NSValue类,其实NSNumber类就是NSValue类的子类。
NSValue中用于装箱操作的方法:
1 2 3 4 5
| +(NSValue *)valueWithPoint:(NSPoint)point;
+(NSValue *)valueWithSize:(NSSize)size;
+(NSValue *)valueWithRect:(NSRect)rect;
|
NSValue中用于拆箱操作的方法:
1 2 3 4 5
| -(NSPoint)pointValue
-(NSSize)sizeValue
-(NSRect)rectValue
|
NSPoint,NSSize,NSRect这几个结构体会在另一篇文章中介绍详细使用方法。
除了这些已经定义好的结构体外我们还能对自定义的结构体进行装箱、拆箱操作。
对自定义结构体进行装箱:
1
| +(NSValue *)valueWithBytes:(const void *)value objCType:(const char *)type;
|
对自定义的结构体进行拆箱:
1
| -(void)getValue:(void *)value;
|
例如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| #import <Foundation/Foundation.h>
typedef struct { int year; int month; int day; } Date;
void test1(){ Date date={2014,2,28}; char *type=@encode(Date); NSValue *value3=[NSValue value:&date withObjCType:type]; NSArray *array2=[NSArray arrayWithObject:value3]; NSLog(@"%@",array2); ( "<de070000 02000000 1c000000>" ) */ Date date2; [value3 getValue:&date2]; NSLog(@"%i,%i,%i",date2.year,date2.month,date2.day); }
int main(int argc, const char * argv[]) { test1(); return 0; }
|
在新版的ObjC中增加了一种简单的装箱方式——@。使用@可以进行快速的装箱操作。
1 2 3 4 5 6
| NSNumber *number1=@100; NSNumber *number2=@(1+2*3); NSArray *array2=@[@"abc",@16,@'A',@16.7,@YES]; NSDictionary *dic1=@{@"a":@123,@"b":@'c',@"c":@YES}; NSMutableDictionary *dic2=[NSMutableDictionary dictionaryWithDictionary:dic1]; dic2[@"a"]=@456;
|
NSString的常见操作
NSString被称作不可修改字符串,一旦被创建就无法再修改其长度和内容。
NSString是以@符开始的字符串。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
| NSString *str =@"我是字符串";
stringWithFormat
NSString *name =@"zhang"; NSString *log = [NSString stringWithFormat:@"I am '%@'",name]; NSLog(@"str:%@",log);
stringWithString
NSString *str =@"我是字符串"; NSString *str1 = [NSString stringWithString:str];
isEqualToString hasPrefix hasSuffix
-(int) intValue; -(double) doubleValue; -(NSInteger) integerValue; -(float) floatValue;
-(NSString*) lowercaseString; -(NSString*) uppercaseString;
-(NSString*)substringFromIndex:i; -(NSString*)substringToIndex:i; -(NSString*)substringWidthRange:range;
-(UNSigned int)length;
char *string = "我是字符串"; NSString *Nstring = [[NSString alloc] initWithUTF8String:string];
NSString *str=@"我是字符串"; char *cStr = [str UTF8String];
|
NSMutableString的常见操作
NSString不允许修改字符串,可以使用NSMutableString,这种类型的字符串是允许被修改的。
NSMutableString是NSString类型的子类,因此所有适合于NSString的函数都适用于NSMutableString。
NSMutableString所特有的修改字符串的函数:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| +(id)stringWithCapacity:size -(id)initWithCapacity:size
-(void)setString:nsstring
-(void)appendString:nsstring
-(void)deleteCharatersInRange:range
-(void)insertString:nsstring atIndex:i
-(void)replaceCharatersInRange;range withString:nsstring
-(void)replaceOccurrencesOfString:nsstring withString:nsstring2 options:opts range:range
|
NSArray的常见操作
Tips
- NSArray是不可变的数组类型
- 只能储存Object-c对象,但可以同时存储不同类型的对象
- 如果想存储原始的c数据,可以使用NSNumber类进行封装
- 数组的最后一个元素一定是nil,表示结束。
- 因为是不可变数组,所以没有插入、删除、替换等函数
- 数组是连续的集合
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| NSArray *array1 = [NSArray arrayWithObjects:string1,string2, nil]; NSArray *array2 = [NSArray arrayWithArray:array1];
NSRange range = NSMakeRange(0, 2); NSArray *subArray = [array1 subarrayWithRange:range];
int arrayLength = [array1 count];
NSString *string = [array1 objectAtIndex:0];
BOOL isInArray = [array1 containsObject:string1];
int index = [array1 indexOfObject:string1];
for(NSString *obj in array1) { NSLog(@"%@",obj); }
for(NSString *objfan in [array1 reverseObjectEnumerator]) { NSLog(@"%@",objfan); }
NSString *str = @"oop : ack : elf : com : cn : net"; NSArray *arr = [str componentsSeparatedByString:@" : "];
str = [arr componentsJoinedByString:@" , "];
|
NSMutableArray的常见操作
NSMutableArray是NSArray的子类,用来提供可被修改的数组。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| [myarray addObject:string3]; [myarray addObject:string2]; [myarray insertObject:string3 atIndex:0]; [myarray insertObject:string2 atIndex:1];
[myarray replaceObjectAtIndex:1 withObject:string3];
[myarray removeObject:string3];
[myarray removeObjectAtIndex:0];
[myarray removeObjectsInRange:range];
[myarray removeAllObjects];
|
NSSet的常见操作
NSSet是和NSArray比较相似的集合,不同点是NSSet是无序的,而NSArray是有序的。
NSSet是无序的不可修改集合,其对元素的查找速度比NSArray快(采用hash查找)。
1 2 3 4 5 6 7 8 9
| +(id)setWithObjects:obj1,obj2,...nil //使用一组对象创建新的集合 -(id)initWithObjects:obj1,obj2,....nil //使用一组对象初始化新分配的集合 -(NSUInteger)count //返回集合成员个数 -(BOOL)containsObject:obj //确定集合是否包含对象 obj -(BOOL)member:obj //确定集合是否包含对象 obj -(NSEnumerator*)objectEnumerator //返回集合中所有对象到一个 NSEnumerator 类型的对象 -(BOOL)isSubsetOfSet:nsset //判断集合是否是NSSet的子集 -(BOOL)intersectsSet:nsset //判断两个集合的交集是否至少存在一个元素 -(BOOL)isEqualToSet:nsset //判断两个集合是否相等
|
NSMutableSet的常见操作
NSMutableSet是NSSet的子类,可以被修改。
1 2 3 4 5 6 7 8
| -(id)setWithCapcity:size //创建一个有size大小的新集合 -(id)initWithCapcity:size //初始化一个新分配的集合,大小为size -(void)addObject:obj //添加对象 obj 到集合中 -(void)removeobject:obj //从集合中删除对象 obj -(void)removeAllObjects //删除集合中所有对象 -(void)unionSet:nsset //将nsset的所有元素添加到集合 -(void)minusSet:nsset //从集合中去掉所有的NSSet 的元素 -(void)interectSet:nsset //集合和NSSet 做交集运算
|
NSDictionary的常见操作
NSDictionary可以将数据以键值对儿的形式储存起来,取值的时候通过KEY就可以直接拿到对应的值,非常方便。
和NSSet一样,NSDictionary也是无序的。
NSDictionary的最后一个元素也需要使nil
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| NSDictionary *dic1 = [NSDictionary dictionaryWithObject:@"value" forKey:@"key"]; NSDictionary *dic2 = [NSDictionary dictionaryWithObjectsAndKeys: @"value1", @"key1", @"value2", @"key2", @"value3", @"key3", @"value4", @"key4", nil]; NSDictionary *dic3 = [NSDictionary dictionaryWithDictionary:dic2];
[dic3 objectForKey:@"key3"]
dic3.count
NSArray *keys = [dic3 allKeys];
NSArray *values = [dic3 allValues];
|
NSMutableDictionary的常见操作
NSMutableDictionary是可以被修改的字典类型。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| NSMutableDictionary *dictMutable = [[NSMutableDictionary alloc] initWithObjectsAndKeys:m_array,@"sort",n_array,@"number", nil];
[dictMutable setObject:string4 forKey:@"sort"];
[dictMutable removeObjectForKey:@"number"];
NSArray *key_array =[NSArray arrayWithObjects:@"sort",@"number", nil]; [dictMutable removeObjectForKey:key_array];
[dictMutable removeAllObjects];
|
三种集合类型
NSArray, NSSet, NSDictionary这三种集合类型(以及相应的可变类型)很相似,下面是这三种集合类型大体上的异同。
相同点:
不同点:
NSArray中的元素是有序排列,而NSSet, NSDictionary中的元素是无序排列
NSArray可以通过下标索引对应的值,NSSet只能通过便利索引对应的值,NSDictionary可以通过key进行索引
NSSet类型更适合做集合的操作,如求交集/并集等
NSNull
前文已经说的,数组和字典的最后一个元素需要使nil,但有时我们需要在数组或者字典里面存储nil类型元素,这个时候为了不和数组、字典结尾的nil混淆,我们可以使用NSNull类型,示例如下:
1 2 3
| NSNull *nl=[NSNull null];
NSArray *array1=[NSArray arrayWithObjects:@"abc",nl,@123, nil];
|