Objective C 总结(七):Foundation Kit中的常类型 Foundation 框架提供了一些常用的struct。struct是值类型 字符串 集合 快速枚举器:for(),用于遍历集合,但不能修改集合中对象的值,用法 各种数值包装类

Objective-C是C的超集,C中的类型和操作在Objective-C中都是可用的。

  1. 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);
  2. NSPoint
    typedef struct _NSPoint
    {
        float x;
        float y;
    } NSPoint;
  3. NSSize
    typedef struct _NSSize 
    {
        float width;
        float height;
    } NSSize;
  4. 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.

  1. 创建
    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“];
  2. 比较
    比较内容的相等用
    - (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;
    NSMutableString提供了追加、删除、替换等的方法。
    - (void) appendString: (NSString *) aString;
    - (void) appendFormat: (NSString *) format;
    - (void) deleteCharactersInRange: (NSRange) range;

集合

集合中只能存储引用对象,如要存储基本类型需要用NSNumber将它们先装箱。集合中不能存储nil,初始化时以nil结束。

  1. 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:)];
  2. NSSet 非顺序集合,存储不重复对象的集合,用法与NSArray一样
  3. 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");
        }
    }

各种数值包装类

  1. 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是不可变的。

  2. 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;