相信大家針對于目前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 [email protected]"測試02";
//str1 完全等價于 str2 ,一般直接使用@“”對NSString對象直接指派
NSInteger num = 33;
NSString *str3 = [NSString stringWithFormat:@"%@%ld",str2,num];//格式化初始化對象 常用于需要不同類型的資料拼接後形成的一個字元串對象,str3 最終值為@“測試0233”
2.字元串截取和替換
NSString*str2 [email protected]"測試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為可變字元串。
NSMutableString 與 NSString 的差別
在看到這裡肯定有不少的人在疑問,這個可變和不可變指的到底是什麼意思呢?因為我們一般在使用NSString建立出的對象我們可以直接對他的内容進行修改的,而且也不會出現問題的,下面我們用代碼來看下他們具體的差別:
NSString*str2 [email protected]"測試02";
NSLog(@"%p",str2);
str2 [email protected]"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 中的集合類型,喜歡的三聯一下哦!