您的位置:首页 > 移动开发 > Objective-C

Objective-c:数据类型

2015-11-13 00:49 369 查看
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);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息