Objective-c:数据类型

  • OC的数值类型,主要分为2种:typedef类型和对象类型;

  • 以常用数据类型为例,C和OC数值类型的对比如下:

    这里写图片描述

NSValue

  • 数值对象,用于复杂数据类型的对象化封装,如结构体;

  • NSValue 对自定义结构体类型的初始化

// 1、结构体类型声明

typedef struct {
    char name[81];
    int  age;  
}Person;

// 2、声明结构体变量并初始化

Person person = {"Charles", 21};

// 3、封装

NSValue *value = [NSValue valueWithBytes:&person objCType:@encode(Person)];

// 4、解封装

Person newPerson;
[value getValue:&newPerson];
NSLog(@"<%p 姓名:%s 年龄:%d>", &newPerson, newPerson.name, newPerson.age);
  • NSValue 对常用系统结构体类型的初始化
// 数据封装
NSValue *value1 = [NSValue valueWithPoint:NSMakePoint(0, 0)];
NSValue *value2 = [NSValue valueWithSize:NSMakeSize(20, 20)];
NSValue *value3 = [NSValue valueWithRect:NSMakeRect(0, 0, 20, 20)];

// 数据解封装
NSPoint point = [value1 pointValue];
NSSize   size = [value2 sizeValue];
NSRect   rect = [value3 rectValue];

NSNumber

  • 数值对象,用于简单数据类型的对象化封装,继承与 NSValue

  • NSNumber的初始化

NSNumber *number1 = [NSNumber numberWithInt:5];
NSNumber *number2 = [NSNumber numberWithFloat:5];
NSNumber *number3 = [NSNumber numberWithDouble:5.0f];

Tips:

实际上对于这3个初始化方法,产生的number是完全一样的,没有任何区别,NSNumber表示数值时,只描述其有效位数。

  • iOS5 之后的新特性,对于NSNumber便利构造器初始化方法,可以简写为 @()
NSNumber *number1 = @(1);
NSNumber *number2 = @(3.14);
NSNumber *number3 = @('A');
NSNumber *number4 = @(YES);
  • 使用 NSNumberFormatter 对 NSNumber 与 NSString 相互转化

  • NSNumberFormatterStyle

1、NSNumberFormatterScientificStyle: 1.23456E5
2、NSNumberFormatterPercentStyle: 12,345,600%
3、NSNumberFormatterCurrencyStyle: ¥ 123,456.00
4、NSNumberFormatterDecimalStyle: 123,456
5、NSNumberFormatterNoStyle: 123456
#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
    @autoreleasepool {

        NSNumber *number = @(12345);
        NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];

        // 设置样式     
        [formatter setNumberStyle:NSNumberFormatterCurrencyStyle];

        // 据样式将 number 转换成字符串
        NSString *numberString = [formatter stringFromNumber:number];

        NSLog(@"number string = %@", numberString); // 输出 number string = ¥ 123,45.00
    }
    return 0;
}
  • NSNumber 比较
NSNumber *number = @(10);
NSNumber *antherNumber = @(10);

// 1、判断是否相等
BOOL isEqual = [number isEqualToNumber:antherNumber];

// 2、比较大小
NSComparisonResult result = [number compare:antherNumber];

// NSOrderedAscending(-1):升序
// NSOrderedSame(0)      :相等
// NSOrderedDescending(1):降序

if (result == NSOrderedAscending) {
    NSLog(@"number < antherNumber");
}else if (result == 0) {
    NSLog(@"number = antherNumber");
}else {
    NSLog(@"number > antherNumber");
}

NSString

  • NSString 是一个类,通过这个类实例化的对象为OC的字符串对象;

  • NSString实例的运算(增、删、查、改等),全部通过方法进行,无法进行任何四则运算;

  • 与C语言的char *类型字符串做一个对比:

    这里写图片描述

初始化

// 1、字面量初始化
NSString *str1 = @"string";

// 2、初始化空字符串
NSString *str2 = [[NSString alloc] init];
NSString *str3 = [NSString string];

// 3、带参数格式初始化
NSString *str4 = [NSString stringWithFormat:@"%@", @"string"];

NSString *str5 = [NSString stringWithFormat:@"%d", 123];

字符串拼接

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
    @autoreleasepool {

        /*
         * 字符串拼接:
         * stringByAppendingString:
         * stringByAppendingFormat:
         */


         // 举例: 将@"123"、@"456"拼接

         NSString *string1 = @"123";
         NSString *string2 = @"456";


         // 一般字符串拼接方法
         NSString *string = [string1 stringByAppendingString:string2];


         // 字符串格式化拼接方法
         string = [string1 stringByAppendingFormat:@"%@", string2];

         NSLog(@"%@", string);

         // 最简单的拼接方法:
         NSString * newString = [NSString stringWithFormat:@"%@%@", string1,string2];
    }
    return 0;
}

字符串截取

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
    @autoreleasepool {

        /*
         * 字符串截取:
         * subStringFromIndex: index为截取起始位置索引
         * subStringToIndex: index为截取总长度
         * subStringWithRange: 传入一个NSRange类型的结构体,包含截取位置及截取长度
         */


         NSString *string = @"abcde";
         NSString *resultString = nil;

         // 举例: 将@"abcde"中的de去掉
         resultString = [string substringToIndex:3];


         // 举例: 将@"abcde"中的abc去掉
         resultString = [string substringFromIndex:2];


         // 举例: 将@"abcde"中的cd去掉
         resultString = [[string substringToIndex:2] stringByAppendingString:[string substringFromIndex:4]];


         // 举例:将@"hello world"字符串通过截取的方式变成@"hd"
         string = @"hello world";
         resultString = [[string substringWithRange:NSMakeRange(0, 1)] stringByAppendingString:[string substringWithRange:NSMakeRange(10, 1)]];

    }
    return 0;
}

字符串查询

  • 普通查询
#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
    @autoreleasepool {

        /*
         * 字符串查询:
         * rangeOfString:  若查不到,location是一个更大的数(NSNotFound),length为0;
         * containsString: iOS8新添加的方法,10.10及以上的OSX系统才能使用
         */

        /* 思考:如何判断在一个string中是否包含另外一个string?@"abcde"是否包含@"cd" */

        NSString *string = @"abcde";

        // 1、方法一:rangeOfString
        NSRange range = [string rangeOfString:@"cd"];

        if (range.location == NSNotFound && range.length == 0) {
            NSLog(@"not fount.");
        }else {
            NSLog(@"found the string.");
        }

        // 2、方法二:containsString
        if ([string containsString:@"cd"]) {
            NSLog(@"found the string.");
        }else {
            NSLog(@"not fount.");
        }
    }
    return 0;
}
  • 查询前缀与后缀
#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
    @autoreleasepool {

        NSString *str = @"baidu.com";

        // 查询前缀
        if ([str hasPrefix:@"http://"]) {
            NSLog(@"str has prefix 'http://'.");
        }else {
            NSLog(@"str has not prefix 'http://'.");
        }

        // 查询后缀
        if ([str hasSuffix:@"com"]) {
            NSLog(@"str has suffix 'com'.");
        }else {
            NSLog(@"str has not suffix 'com'.");
        }

    }
    return 0;
}

字符串替换

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
    @autoreleasepool {


        // 举例: 替换@"abcde"中的@"cd"为大写

        NSString *string = @"abcde";
        NSString *resultString = nil;

        // 方法1:
        NSRange range = [string rangeOfString:@"cd"];
        resultString = [string stringByReplacingCharactersInRange:range withString:@"CD"];

        // 方法2:
        resultString = [string stringByReplacingOccurrencesOfString:@"cd" withString:@"CD"];

        NSLog(@"%@", resultString);

    }
    return 0;
}

字符串比较

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
    @autoreleasepool {

        /*
         * 字符串比较:
         * isEqualToString: 判断字符串是否相同
         * compare:         字符串比较
         * compare: option: 字符串比较(可定义比较模式)
         */


         NSString *string1 = [NSString stringWithFormat:@"123"];
         NSString *string2 = [NSString stringWithFormat:@"123"];

         BOOL isEqual = [string1 isEqualToString:string2];

         // 对比string1 == string2 及 [string1 isEqualToString:string2]

         if (isEqual) {
             NSLog(@"the strings are same.");
         }else {
             NSLog(@"the strings are different.");
         }

         if (string1 == string2) {
             NSLog(@"the strings are same.");
         }else {
             NSLog(@"the strings are different.");
         }

         // compare: option:
         string1 = [NSString stringWithFormat:@"1234"];
         string2 = [NSString stringWithFormat:@"123"];

         // NSComparisonResult:比较结果枚举类型,NSStringCompareOptions比较策略枚举类型
         // NSNumericSearch   :比较字符串长度
         // NSCaseInsensitiveSearch: 大小写不敏感比较
         // NSLiteralSearch        : 完全比较,比较大小写

         NSComparisonResult result = [string1 compare:string2 options:NSNumericSearch | NSCaseInsensitiveSearch];

         if (result == NSOrderedSame) {
             NSLog(@"the strigns are same.");
         }else if (result == NSOrderedAscending) {
             NSLog(@"string1 is less than string2.");
         }else if (result == NSOrderedDescending) {
             NSLog(@"string1 is bigger than string2.");
         }

    }
    return 0;
}

字符串数值与大小写转换

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
    @autoreleasepool {

        /*
         * 字符串常用方法:
         * length:获取长度
         * integerValue、intValue、floatValue 、doubleValue:转换为简单数据类型
         * uppercaseString、lowercaseString、capitalizedString:字符大小写转换
         */

        /* 1.数值转换 */

         NSString *numberString = @"123.456";
         NSInteger integerValue = [numberString integerValue];
         int       intValue     = [numberString intValue];
         float     floatValue   = [numberString floatValue];
         double    doubleValue  = [numberString doubleValue];



        /* 2.大小写转换 */

        NSString *string = @"hello world";
        NSString *uppercaseString  = [string uppercaseString]; // 大写
        NSString *lowercaseString  = [string lowercaseString]; // 小写
        NSString *capitalizeString = [string capitalizedString]; // 首字母大写

    }
    return 0;
}

字符串切分数组

NSString *string = @"12-23-34-45-56-67";
NSArray *array = [string componentsSeparatedByString:@"-"];
NSLog(@"%@", array);

NSString常用方法

这里写图片描述

NSString其他常用方法

这里写图片描述

NSMutableString

  • NSString类型是不可变类型的字符串,OC中有专门的可变类型字符串NSMutableString。

  • NSMutableString继承自NSString,所以他可以直接使用NSString的方法,即可以直接作为不可变字符串使用。

  • NSMutableString使用其父类的方法进行初始化,示例如下:

NSMutableString *string1 = [[NSMutableString alloc]initWithString:@"123"];

NSMutableString *string2 = [NSMutableString stringWithString:@"123"];
  • 几乎所有NSString的运算方法,都同时对应着其可变类型的算法。

  • 一般NSString类型运算都是通过返回值给定一个新NSString对象,而NSMutableString的运算是直接改变原有字符串,所以返回值多为void;

  • 可变字符串常用方法

    这里写图片描述

NSRange

  • C 语言使用结构体、指针和数组来构造复杂的数据类型,而结构体和指针在iOS编程中至关重要,Cococa为我们准备了与字符串操作有关的结构体NSRange:
// NSRange:用来表示相关事物的范围 
typedef struct _NSRange 
{ 
    unsigned int location;     //location表示起始位置
    unsigned int length;       //length表示长度
 } 
  • NSRange有三种创建方式:
比如要得到字符串@“helloRIMIOnline”中@“Online”字符串,需要一个起始位置为9,6个长度的范围,它可以有三种方式创建:
它可以有三种方式创建:

第一种调用函数可以这么写:
    NSRange range = NSMakeRange (9,6);

第二种直接给成员赋值:
    NSRange rangerange.location = 9range.length   = 6;

第三种应用C语言的聚合结构赋值机制:
    NSRange range = {9,6};
  • 类似NSRange,OC复杂的数据类型还有NSPoint、NSSize、以及NSRect。

NSDate

  • NSDate 初始化
#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
    @autoreleasepool {

        /*
         * NSDate 的初始化
         * date 获取当前系统时间,默认为格林威治时间,比北京时间早8小时
         * dateWithTimeInterval:3600 sinceDate: 使用一个传入的时间作为参照,加上偏移时间间隔(秒)
         * dateWithTimeIntervalSince1970: 使用1970-01-01的时间作为参照,加上偏移时间间隔(秒)
         * dateWithTimeIntervalSinceNow: 使用当前的时间作为参照,加上偏移的时间间隔(秒)
         * dateWithTimeIntervalSinceReferenceDate: 使用2001-01-01的时间作为参照,加上偏移的时间间隔(秒)
         */


        NSDate *date = [NSDate date];
        date = [NSDate dateWithTimeInterval:3600 sinceDate:date];
        date = [NSDate dateWithTimeIntervalSince1970:3600];
        date = [NSDate dateWithTimeIntervalSinceNow:3600];
        date = [NSDate dateWithTimeIntervalSinceReferenceDate:3600];
        NSLog(@"%@", date);

    }
    return 0;
}
  • 使用NSDate获取时间间隔
#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
    @autoreleasepool {

        NSDate *date1 = [NSDate date];
        NSDate *date2 = [NSDate dateWithTimeIntervalSinceNow:3600];

        NSTimeInterval timeInterval = 0;
        // 1、与date2的时间间隔
        timeInterval = [date1 timeIntervalSinceDate:date2];
        // 2、与1970年的时间间隔
        timeInterval = [date1 timeIntervalSince1970];
        // 3、与当前时间的时间间隔
        timeInterval = [date1 timeIntervalSinceNow];

        NSLog(@"time interval = %.2f", timeInterval);

    }
    return 0;
}
  • NSDate比较
#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
    @autoreleasepool {

        NSDate *date1 = [NSDate date];
        NSDate *date2 = [NSDate dateWithTimeIntervalSinceNow:3600];

        NSComparisonResult result = [date1 compare:date2]; // 比较两个时间日期

        BOOL isEqual = [date1 isEqualToDate:date2]; // 比较两个日期是否相同

        NSDate *resultDate = nil;
        resultDate = [date1 earlierDate:date2]; // 比较较早的时间日期
        resultDate = [date1 laterDate:date2]; // 比较较晚的时间日期

        NSLog(@"%ld", (long)result);
        NSLog(@"%@", resultDate);

    }
    return 0;
}
  • 使用NSDateFormatter转换NSString与NSDate
#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
    @autoreleasepool {

        /* 使用NSDateFormatter转换NSString与NSDate */

NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
NSString *dateString = nil;
NSDate *date = nil;


/* 1.类方法获取当地时间字符串 */

/*
 dateString = [NSDateFormatter localizedStringFromDate:[NSDate date]
                                             dateStyle:NSDateFormatterFullStyle
                                             timeStyle:NSDateFormatterFullStyle];
 */


/* 2.实例方法获取当地时间字符串 */


[formatter setDateStyle:NSDateFormatterFullStyle];     // 配置日期格式,若没有进行配置则不显示日期部分

[formatter setTimeStyle:NSDateFormatterFullStyle];     // 配置时间格式,若没有进行配置则不显示时间部分
[formatter setDateFormat:@"yyyy-MM-dd EEEE HH:mm:ss"]; // 配置自定义时间、日期格式
dateString = [formatter stringFromDate:[NSDate date]]; // NSDate转NSString
date = [formatter dateFromString:dateString];          // NSString转NSDate


NSLog(@"%@", dateString);
NSLog(@"%@", date);
    }
    return 0;
}
  • 通过NSCalendar类来创建日期
NSDateComponents * comp = [[NSDateComponents alloc]init];
[comp setYear:1993]; // 设置年
[comp setMonth:7];  // 设置月
[comp setDay:16]; // 设置日

[comp setHour:9]; // 设置时
[comp setMinute:14]; // 设置分
[comp setSecond:0];// 设置秒

NSCalendar * myCal = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];

NSDate * myDate = [myCal dateFromComponents:comp];

NSLog(@"%@", myDate);
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值