相信大家针对于当前iOS的环境每个人都有自己的看法,但是基于我一个不算太资深的iOS程序员来说,iOS的市场还是有的,但是水已经比较深了,针对于想入这行的猿友门一定要慎重而行。
针对于当前技术能力参差不齐的现状所以我打算从基础到一个完整项目,写一套有关于iOS开发的博文,希望可以对大家有所帮助,话不多说开始第一篇文章。
一、OC当中涉及到的数据类型
long(长整型)
int (整型)
shot(短整型)
float (浮点型)
double(双精度浮点型)
char(字符型)
由于这些类型都是最最基础的数据类型,涉及到很多C的知识,就不过多的解释了,这些在iOS项目中会有使用到,但是不是最常用的类型,因为OC当中针对这些数据类型都有很好的替换类型。
二、OC自身的数据类型
1).NSInteger NSUInteger NSNumber
1.NSIntiger OC当中的整型(有正负之分,带有符号标识)
2. NSUInteger 也同样是OC当中的整型(无符号类型 ,不带有正负之分)
3.NSNumber 对象数据类型,主要用于存储非对象类型,其主要作用是将非对象类型转化为对象类型来进行存储
- (NSNumber*)initWithChar:(char)valueNS_DESIGNATED_INITIALIZER;//将字符类型转换为对象类型
- (NSNumber*)initWithUnsignedChar:(unsignedchar)valueNS_DESIGNATED_INITIALIZER;//将无符号字符类型转换为对象类型
- (NSNumber*)initWithShort:(short)valueNS_DESIGNATED_INITIALIZER;//将短整型转换为对象类型
- (NSNumber*)initWithUnsignedShort:(unsignedshort)valueNS_DESIGNATED_INITIALIZER;//将无符号短整型转换为对象类型
- (NSNumber*)initWithInt:(int)valueNS_DESIGNATED_INITIALIZER;//将整型转换为对象类型
- (NSNumber*)initWithUnsignedInt:(unsignedint)valueNS_DESIGNATED_INITIALIZER;//将无符号整型转换为对象类型
- (NSNumber*)initWithLong:(long)valueNS_DESIGNATED_INITIALIZER;//将长整型转换为对象类型
- (NSNumber*)initWithUnsignedLong:(unsignedlong)valueNS_DESIGNATED_INITIALIZER;//将无符号长整型转换为对象类型
- (NSNumber*)initWithLongLong:(longlong)valueNS_DESIGNATED_INITIALIZER;
- (NSNumber*)initWithUnsignedLongLong:(unsignedlonglong)valueNS_DESIGNATED_INITIALIZER;
- (NSNumber*)initWithFloat:(float)valueNS_DESIGNATED_INITIALIZER;//将浮点型转换为对象类型
- (NSNumber*)initWithDouble:(double)valueNS_DESIGNATED_INITIALIZER;//将双精度浮点型转换为对象类型
- (NSNumber*)initWithBool:(BOOL)valueNS_DESIGNATED_INITIALIZER;//将bool值类型转换为对象类型
- (NSNumber*)initWithInteger:(NSInteger)valueAPI_AVAILABLE(macos(10.5), ios(2.0), watchos(2.0), tvos(9.0))NS_DESIGNATED_INITIALIZER;//针对OC当中的整型转换为对象类型
- (NSNumber*)initWithUnsignedInteger:(NSUInteger)valueAPI_AVAILABLE(macos(10.5), ios(2.0), watchos(2.0), tvos(9.0))NS_DESIGNATED_INITIALIZER;//针对OC当中的无符号整型转换为对象类型
//下面是对象转换成对应数据类型的反向取值
@property (readonly) char charValue;
@property (readonly) unsigned char unsignedCharValue;
@property (readonly) short shortValue;
@property (readonly) unsigned short unsignedShortValue;
@property (readonly) int intValue;
@property (readonly) unsigned int unsignedIntValue;
@property (readonly) long longValue;
@property (readonly) unsigned long unsignedLongValue;
@property (readonly) long long longLongValue;
@property (readonly) unsigned long long unsignedLongLongValue;
@property (readonly) float floatValue;
@property (readonly) double doubleValue;
@property (readonly) BOOL boolValue;
@property(readonly)NSIntegerintegerValueAPI_AVAILABLE(macos(10.5), ios(2.0), watchos(2.0), tvos(9.0));
@property(readonly)NSUIntegerunsignedIntegerValueAPI_AVAILABLE(macos(10.5), ios(2.0), watchos(2.0), tvos(9.0));
//将对象类型统一转换成字符串类型(不会强转,意思就是对象中储存的是什么内容就直接全部放进字符串中并展示)
@property (readonly, copy) NSString *stringValue;
//对象比较方法(返回值有三种 NSOrderedAscending(小于)NSOrderedSame(等于)NSOrderedDescending(大于))
- (NSComparisonResult)compare:(NSNumber*)otherNumber;
//对象比较方法(返回值有两种 相等(YES)或者不相等(NO))
- (BOOL)isEqualToNumber:(NSNumber*)number;
关于NSNumber的使用操作如下代码
//基本类型转为对象类型
chara ='a';
NSLog(@"%c", a);
NSNumber *number = [[NSNumber alloc] initWithChar:a]; //NSNumber 类型的初始化,其余基本类型转化为number类型的使用是一样的。
NSLog(@"%@",number);
//对象类型转为基本类型
char b = number.charValue;
NSLog(@"%c",b);
输出代码如下
2019-02-20 09:52:09.161082+0800 test01[870:179068] a
2019-02-20 09:52:09.161159+0800 test01[870:179068] 97 //注意这里是ASCII码表下字符a对应的十进制数据,NSNumber当中的字符存储都是使用的ASCII码
2019-02-20 09:52:09.161175+0800 test01[870:179068] a
关于NSNumber对象的比较方法
chara ='a';
charc ='s';
NSNumber *number1 = [[NSNumber alloc] initWithChar:a];
NSNumber *number2 = [[NSNumber alloc] initWithChar:c];
NSLog(@"%@",number1);
NSLog(@"%@",number2);
NSLog(@"%ld",[number1compare:number2]);//比较两个对象的大小
NSLog(@"%d",[number1isEqualToNumber:number2]);//判断是否两个对象相同
输出结果如下
2019-02-20 10:02:25.171390+0800 test01[880:180846] 97 //对象number1的ASCII码表对应的值
2019-02-20 10:02:25.171439+0800 test01[880:180846] 115 //对象number2的ASCII码表对应的值
2019-02-20 10:02:25.171453+0800 test01[880:180846] -1 //两者比较结果 -1为小于 0为等于 1为大于
2019-02-20 10:02:25.171469+0800 test01[880:180846] 0 //两者是否相同的结果 0为不相同 1为相同
2).CGFloat
OC当中的浮点类型,也是开发中主推使用的浮点类型,因其兼容64位操作系统,所以在定义浮点类型的时候还是推荐使用CGFloat类型。
3). NSString
OC当中最常用的对象类型,其存储的对象类型值为字符串,常用于针对视图控件上文字内容的赋值使用。
1.初始化方法
NSString *str1 = [[NSString alloc] initWithString:@"测试01"];
NSString*str2 =@"测试02";
//str1 完全等价于 str2 ,一般直接使用@“”对NSString对象直接赋值
NSInteger num = 33;
NSString *str3 = [NSString stringWithFormat:@"%@%ld",str2,num];//格式化初始化对象 常用于需要不同类型的数据拼接后形成的一个字符串对象,str3 最终值为@“测试0233”
2.字符串截取和替换
NSString*str2 =@"测试02";
//字符串截取方法
[str2 substringFromIndex:1]; //从下标为1的位置开始截取直到字符串最后一位。结果为 “试02”
[str2 substringToIndex:1]; //从下标为0的位置开始截取到下标为1的位置结束。 结果为 “测”
[str2 substringWithRange:NSMakeRange(0, 3)];//从下标为0 的位置开始截取 截取长度为3的字符串。结果为“测试0”,其中第一个数字“0”为截取的起始位置 第二个数字 “3”为截取的长度。
[str2 componentsSeparatedByString:@"0"];//从指定字符串位置分割当前字符串,其返回值为数组类型(此类型后面会有解释 现在单纯只是知道就好)结果为“测试” “2”
需要注意的是无论是哪种截取方式,指定开始或者结束位置是一定要考虑字符串长度的问题,因为超长会导致越界崩溃,以此为例,字符串长度为4 当我们使用[str2 substringFromIndex:5];此方法进行截取时会产生崩溃问题,崩溃日志如下:
*** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSCFConstantString substringFromIndex:]: Index 5 out of bounds; string length 4'
//字符串替换方法
[str2 stringByReplacingCharactersInRange:NSMakeRange(0, 2) withString:@"你好吗?"];//将制定位置的字符串进行替换 结果为“你好吗?02”
[str2 stringByReplacingOccurrencesOfString:@"0" withString:@"01"];//将字符串中包含的指定字符进行替换 结果为“测试012”
//这里需要注意的是在指定位置进行替换的时候也要考虑长度越界的问题,还有需要注意的地方是在替换字符串的时候并不是1:1来进行替换的 可以1:0也可以1:n
3.字符串比较
字符串比较的方法和上面介绍的NSNumber的比较方法是一致的,需要的可以返回去看看。
4).NSMutableString
同样也是OC当中储存字符串的对象类型。其区别是NSString为不可变字符串而NSMutabuleString为可变字符串。
与NSString的区别
在看到这里肯定有不少的人在疑问,这个可变和不可变指的到底是什么意思呢?因为我们一般在使用NSString创建出的对象我们可以直接对他的内容进行修改的,而且也不会出现问题的,下面我们用代码来看下他们具体的区别:
NSString*str2 =@"测试02";
NSLog(@"%p",str2);
str2 =@"cecece";
NSLog(@"%p",str2);
NSMutableString *str1 = [[NSMutableString alloc] initWithString:@"测试01"];
NSLog(@"%p",str1);
[str1insertString:@"222" atIndex:2];
NSLog(@"%p",str1);
//其打印结果为:
2019-02-20 14:52:44.765117+0800 test01[1123:235758] 0x102344068
2019-02-20 14:52:44.765170+0800 test01[1123:235758] 0x1023440a8
2019-02-20 14:52:44.765186+0800 test01[1123:235758] 0x281c6ce10
2019-02-20 14:52:44.765199+0800 test01[1123:235758] 0x281c6ce10
从结果我们就可以看出当我们针对str2来进行修改的时候其实就是在内存地址中从新给str2指向一个新的地址,而我们在对str1进行操作的时候就是在当前地址上对当前地址上的内容进行的修改。由此可以看出可变不可变其实指的是只想当前内存地址上的内容是否可变。(各位要是对内存了解的不太深那请好好去看下C语言当中内存的部分。在这里就不过多的解释了)
此次咱们这一篇文章就算结束了,下一篇我们要说的是OC中的集合类型,喜欢的点个赞哦!