Objective-C是C的超集,C中的类型和操作在Objective-C中都是可用的。
Foundation 框架提供了一些常用的struct。struct是值类型
- NSRance
typedef struct _NSRange { unsigned int location; unsigned int length; } NSRange;
第一种初始化方法
NSRange range; range.location = 11; range.length = 55;
第二种方法
NSRange range = {17, 55};
第三种方法,使用框架提供的C函数,这种编程方式在objective-c开发中大量的使用了
NSRange range = NSMakeRange(11, 55);
- NSPoint
typedef struct _NSPoint { float x; float y; } NSPoint;
- NSSize
typedef struct _NSSize { float width; float height; } NSSize;
- NSRect
typedef struct _NSRect { NSPoint origin; NSSize size; } NSRect;
上面的结构都提供了快捷C函数,NSMakePoint(x,y),NSMakeSize(width,height),NSMakeRect(x,y,width,height)
字符串
NSString-不可变字符串和NSMutableString可变字符串,框架中大量的类提供的不可变版本和可变版本。如NSArray和NSMutableArray,NSDictionary和NSMutableDictionary,NSSet和NSMutableSet.
- 创建
NSString *name = @"Bob"; NSString *name = [[NSString alloc] initWithFormat: @"My name is %@", @"Bob"]; NSString *name = [NSString stringWithFormat: @"My name is %@", @"Bob"]; NSString *name = [NSString stringWithUTF8String: "My name is Bob“];
- 比较
比较内容的相等用- (BOOL) isEqualToString: (NSString *) aString;
注意下面这样比较的是对象
if(aString == bString)
- (NSComparisonResult) compare: (NSString *)string; - (NSComparisonResult) compare: (NSString *)string options: (unsigned int) mask;
typedef enum _NSComparisonResult { NSOrderedAscending = -1, NSOrderedSame, NSOrderedDescending } NSComparisonResult;
- (void) appendString: (NSString *) aString; - (void) appendFormat: (NSString *) format; - (void) deleteCharactersInRange: (NSRange) range;
集合
集合中只能存储引用对象,如要存储基本类型需要用NSNumber将它们先装箱。集合中不能存储nil,初始化时以nil结束。
- NSArray, 顺序集合,它分配一块连续的内存区域
初始化方法,
+ (id)arrayWithObject:(id)anObject; + (id)arrayWithObjects:(id)firstObject, ...; - (id)initWithObjects:(id)firstObject, ...;
NSArray *someArray = [NSArray arrayWithObjects: firstObject, secondObject, thirdObject, nil];
NSArray *someArray = @[firstObject, secondObject, thirdObject];
查询
NSUInteger numberOfItems = [someArray count]; if ([someArray containsObject:someString]) { ... } // 访问对象 if ([someArray count] > 0) { NSLog(@"First item is: %@", [someArray objectAtIndex:0]); } // 用下标方式访问对象 if ([someArray count] > 0) { NSLog(@"First item is: %@", someArray[0]); }
排序
NSArray *unsortedStrings = @[@"gammaString", @"alphaString", @"betaString"]; NSArray *sortedStrings = [unsortedStrings sortedArrayUsingSelector:@selector(compare:)];
可变数组
NSMutableArray *mutableArray = [NSMutableArray array]; [mutableArray addObject:@"gamma"]; [mutableArray addObject:@"alpha"]; [mutableArray addObject:@"beta"]; [mutableArray replaceObjectAtIndex:0 withObject:@"epsilon"];
[mutableArray sortUsingSelector:@selector(caseInsensitiveCompare:)];
- NSSet 非顺序集合,存储不重复对象的集合,用法与NSArray一样
- NSDictionary 字典,以key-value对的方式存储的数据结构
创建NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys: someObject, @"anObject", @"Hello, World!", @"helloString", @42, @"magicNumber", someValue, @"aValue", nil];
NSDictionary *dictionary = @{ @"anObject" : someObject, @"helloString" : @"Hello, World!", @"magicNumber" : @42, @"aValue" : someValue };
查询
NSNumber *storedNumber = [dictionary objectForKey:@"magicNumber"];
可变字典
[dictionary setObject:@"another string" forKey:@"secondString"]; [dictionary removeObjectForKey:@"anObject"];
NSNull可作为空值存储到集合中,它只有一种用法[NSNull null],表示空对象,nil则表示空地址
NSArray *array = @[ @"string", @42, [NSNull null] ]; for (id object in array) { if (object == [NSNull null]) { NSLog(@"Found a null object"); } }
快速枚举器:for(),用于遍历集合,但不能修改集合中对象的值,用法
for (id object in array) { if (object == [NSNull null]) { NSLog(@"Found a null object"); } }
各种数值包装类
- NSNumber,对基本类型的对象形式装箱(即作为对象存储到heap中),拆箱即获取原来的值
NSNumber *magicNumber = [[NSNumber alloc] initWithInt:42]; NSNumber *unsignedNumber = [[NSNumber alloc] initWithUnsignedInt:42u]; NSNumber *longNumber = [[NSNumber alloc] initWithLong:42l]; NSNumber *boolNumber = [[NSNumber alloc] initWithBOOL:YES]; NSNumber *simpleFloat = [NSNumber numberWithFloat:3.14f]; NSNumber *betterDouble = [NSNumber numberWithDouble:3.1415926535]; NSNumber *someChar = [NSNumber numberWithChar:'T'];
上面实例方法都提供了对应的类方法,下面是快速语法
NSNumber *magicNumber = @42; NSNumber *unsignedNumber = @42u; NSNumber *longNumber = @42l; NSNumber *boolNumber = @YES; NSNumber *simpleFloat = @3.14f; NSNumber *betterDouble = @3.1415926535; NSNumber *someChar = @'T';
拆箱
int scalarMagic = [magicNumber intValue]; unsigned int scalarUnsigned = [unsignedNumber unsignedIntValue]; long scalarLong = [longNumber longValue]; BOOL scalarBool = [boolNumber boolValue]; float scalarSimpleFloat = [simpleFloat floatValue]; double scalarBetterDouble = [betterDouble doubleValue]; char scalarChar = [someChar charValue];
NSNumber是不可变的。
- NSValue 对结构类型的装箱
NSRect rect = NSMakeRect(1,2,30,40); NSValue *value = [NSValue valueWithBytes: &rect objCType: @encode(NSRect)];
拆箱
[value getValue: &rect];
对于常见的结构框架已封闭好了方法
+ NSValue *)valueWithPoint: (NSPoint) point; + (NSValue *) valueWithSize: (NSSize) size; - (NSPoint) pointValue; - (NSSize) sizeValue;