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 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);