Objective-c:数据类型
2015-11-13 00:49
369 查看
OC的数值类型,主要分为2种:typedef类型和对象类型;
以常用数据类型为例,C和OC数值类型的对比如下:
NSValue 对自定义结构体类型的初始化
NSValue 对常用系统结构体类型的初始化
NSNumber的初始化
Tips:
实际上对于这3个初始化方法,产生的number是完全一样的,没有任何区别,NSNumber表示数值时,只描述其有效位数。
iOS5 之后的新特性,对于NSNumber便利构造器初始化方法,可以简写为
使用 NSNumberFormatter 对 NSNumber 与 NSString 相互转化
NSNumberFormatterStyle
NSNumber 比较
NSString实例的运算(增、删、查、改等),全部通过方法进行,无法进行任何四则运算;
与C语言的char *类型字符串做一个对比:
查询前缀与后缀
NSMutableString继承自NSString,所以他可以直接使用NSString的方法,即可以直接作为不可变字符串使用。
NSMutableString使用其父类的方法进行初始化,示例如下:
几乎所有NSString的运算方法,都同时对应着其可变类型的算法。
一般NSString类型运算都是通过返回值给定一个新NSString对象,而NSMutableString的运算是直接改变原有字符串,所以返回值多为void;
可变字符串常用方法
NSRange有三种创建方式:
类似NSRange,OC复杂的数据类型还有NSPoint、NSSize、以及NSRect。
使用NSDate获取时间间隔
NSDate比较
使用NSDateFormatter转换NSString与NSDate
通过NSCalendar类来创建日期
以常用数据类型为例,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 range; range.location = 9; range.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);
相关文章推荐
- MySQL中的integer 数据类型
- MySQL 数据类型
- PostgreSQL教程(四):数据类型详解
- Lua学习笔记之数据类型
- 实现Lua中数据类型的源码分享
- Lua数据类型介绍
- SQL 研究 相似的数据类型
- 详解SQLite中的数据类型
- PowerShell中使用GetType获取变量数据类型
- c# 数据类型占用的字节数介绍
- C#难点逐个击破(6):C#数据类型与.net framework数据类型
- C#、ASP.NET通用工具类IsWhat?(可以判断数字、身份证、数据类型等等)
- MySQL数据类型和常用字段属性总结
- sql server 常用的几个数据类型
- C++学习小结之数据类型及转换方式
- C++编程中的数据类型和常量学习教程
- C#编程自学之数据类型和变量一
- Javascript学习笔记1 数据类型
- 浅谈JavaScript数据类型及转换
- Javascript中的五种数据类型详解