ios开发ios9新特性关键字学习:泛型,逆变,协变,__kindof
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                ios开发ios9新特性关键字学习:泛型,逆变,协变,__kindof
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.                        
                                一:如何去學習?都去學習什么?
1:學習優秀項目的設計思想,多問幾個為什么,為什么要這么設計,這么設計的好處是什么,還能不能在優化 ,如何應用到自己的項目中 2:學習優秀項目的代碼風格,代碼的封裝設計思想,為什么要這么設計,這么設計的好處是什么,還能不能在優化 ,如何應用到自己的項目中,每行代碼都要用心去寫,每一行代碼都要力求使最簡潔的
3:學習別人遇到問題是如何分析問題,解決問題的方法是什么
4:遇到新東西應該如何去學習:1:先研究要學習的東西作用是什么 ,有什么好處 ?2:如何使用:具體的語法知識 ,參照蘋果的API 3:使用場景:一般在項目中有什么應用。
5:最重要的就是花大量的時間研究優秀的代碼,比別人想的深比別人想的遠,注意每一個細節,把每一個細節都要搞懂,把每一個細節做到極致,花大量的時間去實踐練習,將學習到的知識應用于項目中。
?
二:nullable,?nonnull,null_resettable,_Null_unspecified 的關鍵字的認識
/* 1:介紹怎么去研究新特性? 1.使用新的xcode創建項目,用舊的xcode去打開Xcode7 2015 iOS9Xcode6 2014 iOS8Xcode5 2013 iOS7Xcode4 2012 iOS61.出了哪些新特性 iOS9:關鍵字:可以用于屬性,方法返回值和參數中關鍵字作用:提示作用,告訴開發者屬性信息關鍵字目的:迎合swift,swift是個強語言,swift必須要指定一個對象是否為空關鍵字好處:提高代碼規劃,減少溝通成本關鍵字僅僅是提供警告,并不會報編譯錯誤*//* 2:nullable:nullable:1.怎么使用(語法) 2.什么時候使用(作用)nullable作用:可能為空nullable 語法1@property (nonatomic, strong, nullable) NSString *name;nullable 語法2 * 關鍵字 變量名@property (nonatomic, strong) NSString * _Nullable name;nullable 語法3@property (nonatomic, strong) NSString * __nullable name;*//* 3:nonnullnonnull:1.怎么使用(語法) 2.什么時候使用(作用)nonnull作用:不能為空nonnull 語法1@property (nonatomic, strong, nullable) NSString *name;nonnull 語法2 * 關鍵字 變量名@property (nonatomic, strong) NSString * _Nonnull name;nonnull 語法3@property (nonatomic, strong) NSString * __nonnull name;*//*4:null_resettable:null_resettable:1.怎么使用(語法) 2.什么時候使用(作用)null_resettable:必須要處理為nil情況,重寫get方法null_resettable作用:get方法不能返回nil,set可以傳入為空null_resettable 語法1@property (nonatomic, strong, null_resettable) NSString *name;- (NSString *)name{if (_name == nil) {_name = @"";}return _name;}*//*5:_Null_unspecified:不確定是否為空*//*6:1:關鍵字注意點在NS_ASSUME_NONNULL_BEGIN和NS_ASSUME_NONNULL_END之間默認是nonnull,一般前者寫在頭文件之下,后者寫在end之上2:關鍵字不能用于基本數據類型(int,float),nil只用于對象3: @property (nonatomic) NSString *name;如此寫法,默認為strong修飾的*/#import "ViewController.h"@interface ViewController ()// nonnull // 沒有處理為空的情況 @property (nonatomic, strong, nonnull)NSString *name;@end@implementation ViewController//- (UIView *)view //{ // if (_view == nil) { // [self loadView]; // [self viewDidLoad]; // } // return _view //}- (void)viewDidLoad {[super viewDidLoad];// Do any additional setup after loading the view, typically from a nib. }@end三:泛型
#import "ViewController.h"/*1:泛型介紹泛型:限制類型 為什么要推出泛型?迎合swift泛型作用:1.限制類型 2.提高代碼規劃,減少溝通成本,一看就知道集合中是什么東西泛型定義用法:類型<限制類型>:NSMutableArray<NSString *> *arr,數組里存放的都是字符串類型2:類的泛型聲明:泛型聲明:在聲明類的時候,在類的后面<泛型名稱>:@interface Person<ObjectType> : NSObject泛型僅僅是報警告泛型好處:1.從數組中取出來,可以使用點語法:數組中存放元素的類型為id類型, id是不能使用點語法,但是利用泛型,給其限制類型,則從數組中取出對象后,可以利用點語法2.給數組添加元素,有提示3: 泛型在開發中使用場景:1.用于限制集合類型:(集合類包括NSArray和NSSet,兩者用法相同,前者是有序的,而后者卻是無序的)為什么集合可以使用泛型?使用泛型,必須要先聲明泛型? => 如何聲明泛型自定義泛型?什么時候使用泛型?2: 在聲明類的時候,不確定某些屬性或者方法類型,在使用這個類的時候才確定,就可以采用泛型自定義Person,會一些編程語言(iOS,Java),在聲明Person,不確定這個人會什么,在使用Person才知道這個Person會什么語言如果沒有定義泛型.默認就是id例如:1;聲明泛型#import <Foundation/Foundation.h>@interface Person<ObjectType> : NSObject// 語言@property (nonatomic, strong) ObjectType language;@end2:使用:Java *java = [[Java alloc] init];iOS *ios = [[iOS alloc] init];// iOSPerson<iOS *> *p = [[Person alloc] init];p.language = ios;// JavaPerson<Java *> *p1 = [[Person alloc] init];p1.language = java;*/#import "Person.h" #import "Java.h" #import "iOS.h" @interface ViewController ()@property (nonatomic, strong) NSMutableArray<NSString *> *arr;@end@implementation ViewController- (void)viewDidLoad {[super viewDidLoad];Java *java = [[Java alloc] init];iOS *ios = [[iOS alloc] init];// iOSPerson<iOS *> *p = [[Person alloc] init];p.language = ios;// JavaPerson<Java *> *p1 = [[Person alloc] init];p1.language = java; }- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {}@end四:泛型的協變和逆變
#import "ViewController.h"/* 1:泛型:限制類型 為什么要推出泛型?迎合swift泛型作用:1.限制類型 2.提高代碼規劃,減少溝通成本,一看就知道集合中是什么東西泛型定義用法:類型<限制類型>泛型聲明:在聲明類的時候,在類的后面<泛型名稱>泛型僅僅是報警告泛型好處:1.從數組中取出來,可以使用點語法2.給數組添加元素,有提示泛型在開發中使用場景:1.用于限制集合類型id是不能使用點語法為什么集合可以使用泛型?使用泛型,必須要先聲明泛型? => 如何聲明泛型自定義泛型?什么時候使用泛型?在聲明類的時候,不確定某些屬性或者方法類型,在使用這個類的時候才確定,就可以采用泛型自定義Person,會一些編程語言(iOS,Java),在聲明Person,不確定這個人會什么,在使用Person才知道這個Person會什么語言如果沒有定義泛型.默認就是id用于父子類型轉換泛型:__covariant:協變, 子類轉父類 :也就是將子類的指針賦值給子類__contravariant:逆變 父類轉子類:也就是將父類的指針賦值給子類泛型注意點:在數組中,一般用可變數組添加方法,泛型才會生效,如果使用不可變數組,添加元素,泛型沒有效果,只是提示的作用2:繼承:子類繼承父類后,父類可在.h中暴露方法例如初始化方法供子類去繼承 1:父類只暴露了初始化方法沒有重寫,子類繼承后,子類可以重寫,(子類在重寫時,盡量用self,不要用類名,避免其他類在繼承該類的時候,初始化得到的都是該類的對象,而不是繼承的子類的對象。)那么子類重寫后,在父類中的self就為子類的對象,其中多個子類繼承同一個父類的時候,父類可以提供一個get的標識方法供子類重寫返回標識,從而在父類中來區分不同的子類 2:父類提供方法,供子類繼承,父類在實現該方法,則子類在外部調用初始化方法的時候,就會調用父類中實現的初始化方法。(新浪參數模型抽父類繼承的例子),若是子類又重寫父類的初始化方法,調用super會執行父類的方法,否則就不會執行父類的方法,會覆蓋掉父類的方法,只保留子類的方法*/#import "Person.h" #import "Java.h" #import "iOS.h" @interface ViewController ()@property (nonatomic, strong) NSMutableArray<NSString *> *arr;@end@implementation ViewController- (void)viewDidLoad {[super viewDidLoad];[_arr addObject:@"123"]; // _arr = @[@"213",@"213",@1];// Do any additional setup after loading the view, typically from a nib. iOS *ios = [[iOS alloc] init];Language *language = [[Language alloc] init];// 父類轉子類Person<Language *> *p = [[Person alloc] init];p.language = language;// iOSPerson<iOS *> *p1 = [[Person alloc] init];p1 = p;} // 子類轉父類 - (void)covariant {iOS *ios = [[iOS alloc] init];Language *language = [[Language alloc] init];// iOSPerson<iOS *> *p = [[Person alloc] init];p.language = ios;// LanguagePerson<Language *> *p1;p1 = p;}- (void)test {Java *java = [[Java alloc] init];iOS *ios = [[iOS alloc] init];// iOSPerson<iOS *> *p = [[Person alloc] init];p.language = ios;// JavaPerson<Java *> *p1 = [[Person alloc] init];p1.language = java;}@end五:__kindof
#import "ViewController.h" #import "SubPerson.h"/*kindof:相當于__kindof:表示當前類或者它的子類',類設計歷史id:可以調用任何對象方法,可以作為參數或是返回值,不能進行編譯檢查instancetype:自動識別當前類的對象,只能作為返回值不能作為參數,自動返回與當前類類型相同的對象*/@interface ViewController ()@end@implementation ViewController- (void)viewDidLoad {[super viewDidLoad];/*** 當父類提供初始化的方法的時候,子類繼承了父類的方法,若是子類SubPerson調用父類的初始化方法:person,則返回的是父類對象的類型,會出現警告,這時,可以在父類中定義的初始化方法用__kindof來修飾,表示當前類或是其子類。+ (__kindof Person *)person;*/SubPerson *p = [SubPerson person];}@end?
轉載于:https://www.cnblogs.com/cqb-learner/p/5868702.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的ios开发ios9新特性关键字学习:泛型,逆变,协变,__kindof的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 摄像头(Camera)图像测试(以Ima
- 下一篇: 米酷影视v7.2.1影视电影网站管理系统
