相信大家針對于當前iOS的環(huán)境每個人都有自己的看法,但是基于我一個不算太資深的iOS程序員來說,iOS的市場還是有的,但是水已經(jīng)比較深了,針對于想入這行的猿友門一定要慎重而行。
針對于當前技術(shù)能力參差不齊的現(xiàn)狀所以我打算從基礎(chǔ)到一個完整項目,寫一套有關(guān)于iOS開發(fā)的博文,希望可以對大家有所幫助,話不多說開始第一篇文章。
一、OC當中涉及到的數(shù)據(jù)類型?
long(長整型)?
int (整型)
shot(短整型)?
float (浮點型)
double(雙精度浮點型)
char(字符型)
由于這些類型都是最最基礎(chǔ)的數(shù)據(jù)類型,涉及到很多C的知識,就不過多的解釋了,這些在iOS項目中會有使用到,但是不是最常用的類型,因為OC當中針對這些數(shù)據(jù)類型都有很好的替換類型。
二、OC自身的數(shù)據(jù)類型
1).NSInteger??NSUInteger??NSNumber
?1.NSIntiger OC當中的整型(有正負之分,帶有符號標識)
?2. NSUInteger 也同樣是OC當中的整型(無符號類型 ,不帶有正負之分)
?3.NSNumber 對象數(shù)據(jù)類型,主要用于存儲非對象類型,其主要作用是將非對象類型轉(zhuǎn)化為對象類型來進行存儲
? ? ? ? ? ? - (NSNumber*)initWithChar:(char)valueNS_DESIGNATED_INITIALIZER;//將字符類型轉(zhuǎn)換為對象類型
????????????- (NSNumber*)initWithUnsignedChar:(unsignedchar)valueNS_DESIGNATED_INITIALIZER;//將無符號字符類型轉(zhuǎn)換為對象類型
????????????- (NSNumber*)initWithShort:(short)valueNS_DESIGNATED_INITIALIZER;//將短整型轉(zhuǎn)換為對象類型
????????????- (NSNumber*)initWithUnsignedShort:(unsignedshort)valueNS_DESIGNATED_INITIALIZER;//將無符號短整型轉(zhuǎn)換為對象類型
????????????- (NSNumber*)initWithInt:(int)valueNS_DESIGNATED_INITIALIZER;//將整型轉(zhuǎn)換為對象類型
????????????- (NSNumber*)initWithUnsignedInt:(unsignedint)valueNS_DESIGNATED_INITIALIZER;//將無符號整型轉(zhuǎn)換為對象類型
????????????- (NSNumber*)initWithLong:(long)valueNS_DESIGNATED_INITIALIZER;//將長整型轉(zhuǎn)換為對象類型
????????????- (NSNumber*)initWithUnsignedLong:(unsignedlong)valueNS_DESIGNATED_INITIALIZER;//將無符號長整型轉(zhuǎn)換為對象類型
????????????- (NSNumber*)initWithLongLong:(longlong)valueNS_DESIGNATED_INITIALIZER;
????????????- (NSNumber*)initWithUnsignedLongLong:(unsignedlonglong)valueNS_DESIGNATED_INITIALIZER;
????????????- (NSNumber*)initWithFloat:(float)valueNS_DESIGNATED_INITIALIZER;//將浮點型轉(zhuǎn)換為對象類型
????????????- (NSNumber*)initWithDouble:(double)valueNS_DESIGNATED_INITIALIZER;//將雙精度浮點型轉(zhuǎn)換為對象類型
????????????- (NSNumber*)initWithBool:(BOOL)valueNS_DESIGNATED_INITIALIZER;//將bool值類型轉(zhuǎn)換為對象類型
????????????- (NSNumber*)initWithInteger:(NSInteger)valueAPI_AVAILABLE(macos(10.5), ios(2.0), watchos(2.0), tvos(9.0))NS_DESIGNATED_INITIALIZER;//針對OC當中的整型轉(zhuǎn)換為對象類型
????????????- (NSNumber*)initWithUnsignedInteger:(NSUInteger)valueAPI_AVAILABLE(macos(10.5), ios(2.0), watchos(2.0), tvos(9.0))NS_DESIGNATED_INITIALIZER;//針對OC當中的無符號整型轉(zhuǎn)換為對象類型
? ? ? ? ? ? //下面是對象轉(zhuǎn)換成對應(yīng)數(shù)據(jù)類型的反向取值
????????????@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));
? ? ? ? ? ?//將對象類型統(tǒng)一轉(zhuǎn)換成字符串類型(不會強轉(zhuǎn),意思就是對象中儲存的是什么內(nèi)容就直接全部放進字符串中并展示)
????????????@property (readonly, copy) NSString *stringValue;
? ? ? ? ? ? //對象比較方法(返回值有三種 NSOrderedAscending(小于)NSOrderedSame(等于)NSOrderedDescending(大于))
????????????- (NSComparisonResult)compare:(NSNumber*)otherNumber;
? ? ? ? ? ? //對象比較方法(返回值有兩種 相等(YES)或者不相等(NO))
????????????- (BOOL)isEqualToNumber:(NSNumber*)number;
關(guān)于NSNumber的使用操作如下代碼
//基本類型轉(zhuǎn)為對象類型
????chara ='a';
? ? NSLog(@"%c", a);
? ? NSNumber *number = [[NSNumber alloc] initWithChar:a];? //NSNumber 類型的初始化,其余基本類型轉(zhuǎn)化為number類型的使用是一樣的。
? ? NSLog(@"%@",number);
//對象類型轉(zhuǎn)為基本類型
? ? 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對應(yīng)的十進制數(shù)據(jù),NSNumber當中的字符存儲都是使用的ASCII碼
2019-02-20 09:52:09.161175+0800 test01[870:179068] a
關(guān)于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]);//判斷是否兩個對象相同
輸出結(jié)果如下
2019-02-20 10:02:25.171390+0800 test01[880:180846] 97 //對象number1的ASCII碼表對應(yīng)的值
2019-02-20 10:02:25.171439+0800 test01[880:180846] 115 //對象number2的ASCII碼表對應(yīng)的值
2019-02-20 10:02:25.171453+0800 test01[880:180846] -1 //兩者比較結(jié)果 -1為小于 0為等于 1為大于?
2019-02-20 10:02:25.171469+0800 test01[880:180846] 0 //兩者是否相同的結(jié)果 0為不相同 1為相同
2).CGFloat?
OC當中的浮點類型,也是開發(fā)中主推使用的浮點類型,因其兼容64位操作系統(tǒng),所以在定義浮點類型的時候還是推薦使用CGFloat類型。
3). NSString
OC當中最常用的對象類型,其存儲的對象類型值為字符串,常用于針對視圖控件上文字內(nèi)容的賦值使用。
1.初始化方法
? ? NSString *str1 = [[NSString alloc] initWithString:@"測試01"];
? ? NSString*str2 =@"測試02";
? ? //str1 完全等價于 str2 ,一般直接使用@“”對NSString對象直接賦值
? ? NSInteger num = 33;? ? ?
????NSString *str3 = [NSString stringWithFormat:@"%@%ld",str2,num];//格式化初始化對象 常用于需要不同類型的數(shù)據(jù)拼接后形成的一個字符串對象,str3 最終值為@“測試0233”
2.字符串截取和替換
? ? NSString*str2 =@"測試02";
? ? //字符串截取方法
????[str2 substringFromIndex:1]; //從下標為1的位置開始截取直到字符串最后一位。結(jié)果為 “試02”
? ??[str2 substringToIndex:1]; //從下標為0的位置開始截取到下標為1的位置結(jié)束。 結(jié)果為 “測”
? ??[str2 substringWithRange:NSMakeRange(0, 3)];//從下標為0 的位置開始截取 截取長度為3的字符串。結(jié)果為“測試0”,其中第一個數(shù)字“0”為截取的起始位置 第二個數(shù)字 “3”為截取的長度。
? ??[str2 componentsSeparatedByString:@"0"];//從指定字符串位置分割當前字符串,其返回值為數(shù)組類型(此類型后面會有解釋 現(xiàn)在單純只是知道就好)結(jié)果為“測試”? “2”
? ? 需要注意的是無論是哪種截取方式,指定開始或者結(jié)束位置是一定要考慮字符串長度的問題,因為超長會導(dǎo)致越界崩潰,以此為例,字符串長度為4 當我們使用[str2 substringFromIndex:5];此方法進行截取時會產(chǎn)生崩潰問題,崩潰日志如下:
? ???*** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSCFConstantString substringFromIndex:]: Index 5 out of bounds; string length 4'
? ? //字符串替換方法
? ??[str2 stringByReplacingCharactersInRange:NSMakeRange(0, 2) withString:@"你好嗎?"];//將制定位置的字符串進行替換 結(jié)果為“你好嗎?02”
? ??[str2 stringByReplacingOccurrencesOfString:@"0" withString:@"01"];//將字符串中包含的指定字符進行替換 結(jié)果為“測試012”
? ? //這里需要注意的是在指定位置進行替換的時候也要考慮長度越界的問題,還有需要注意的地方是在替換字符串的時候并不是1:1來進行替換的 可以1:0也可以1:n
3.字符串比較
字符串比較的方法和上面介紹的NSNumber的比較方法是一致的,需要的可以返回去看看。
4).NSMutableString
同樣也是OC當中儲存字符串的對象類型。其區(qū)別是NSString為不可變字符串而NSMutabuleString為可變字符串。
與NSString的區(qū)別
在看到這里肯定有不少的人在疑問,這個可變和不可變指的到底是什么意思呢?因為我們一般在使用NSString創(chuàng)建出的對象我們可以直接對他的內(nèi)容進行修改的,而且也不會出現(xiàn)問題的,下面我們用代碼來看下他們具體的區(qū)別:
? ? 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);
? ? //其打印結(jié)果為:
????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
從結(jié)果我們就可以看出當我們針對str2來進行修改的時候其實就是在內(nèi)存地址中從新給str2指向一個新的地址,而我們在對str1進行操作的時候就是在當前地址上對當前地址上的內(nèi)容進行的修改。由此可以看出可變不可變其實指的是只想當前內(nèi)存地址上的內(nèi)容是否可變。(各位要是對內(nèi)存了解的不太深那請好好去看下C語言當中內(nèi)存的部分。在這里就不過多的解釋了)
此次咱們這一篇文章就算結(jié)束了,下一篇我們要說的是OC中的集合類型,喜歡的點個贊哦!