iOS-關鍵字-泛型ObjectType 協變__covariant 逆變__contravariant
一.泛型作用
泛型:限制型別
為什麼要推出泛型?迎合swift
泛型作用:1.限制型別 2.提高程式碼規劃,減少溝通成本,一看就知道集合中是什麼東西
二.泛型用法:
__covariant:協變, 子類轉父類
__contravariant:逆變 父類轉子類
1.泛型宣告:在宣告類的時候,在類的後面<泛型名稱>
//第一步 宣告泛型
@interface Person<__covariant ObjectType> : NSObject
// 語言
@property (nonatomic, strong) ObjectType language;
2.使用泛型 型別<限制型別>
// iOS
Person<iOS *> *p = [[Person alloc] init];
p.language = ios;
不遵守泛型僅僅是報警告
三.泛型在開發中的使用
泛型在開發中使用場景:1.用於限制集合型別
泛型好處:1.從陣列中取出來,可以使用點語法
2.給陣列新增元素,有提示
@property (nonatomic,strong)NSMutableArray<NSString *> *arr;
限制資料裡面的集合是NSStringid是不能使用點語法
泛型注意點:在陣列中,一般用可變陣列新增方法,泛型才會生效,如果使用不可變陣列,新增元素,泛型沒有效果
四.泛型使用舉例
什麼時候使用泛型?在宣告類的時候,不確定某些屬性或者方法型別,在使用這個類的時候才確定,就可以採用泛型
自定義Person,會一些程式語言(iOS,Java),在宣告Person,不確定這個人會什麼,在使用Person才知道這個Person會什麼語言
如果沒有定義泛型.預設就是id
<一>.先自定義類
1.自定義Person類.裡面有一個language屬性,不知道是什麼型別的,自定義為泛型,並且新增協變和逆變
// Person.h
#import <Foundation/Foundation.h>
//第一步 宣告泛型
//__covariant 協變,子類轉父類 泛型名字是ObjectType
@interface Person<__covariant ObjectType> :NSObject
// 語言
@property (nonatomic,strong) ObjectType language;
@end
#import <Foundation/Foundation.h>
@interface Language : NSObject
@end
#import "Language.h"
@interface Java : Language
@end
#import "Language.h"
@interface iOS : Language
@end
#import <Foundation/Foundation.h>
// 泛型名字是ObjectType
@interface Person<ObjectType> : NSObject
// 語言
@property (nonatomic,strong) ObjectType language;
@end
- (void)test
{
Java *java = [[Javaalloc]init];
iOS *ios = [[iOSalloc]init];
// iOS 指定這個人會的是iOS
Person<iOS *> *p = [[Personalloc]init];
p.language = ios;
// Java 指定這個人會的是Java
Person<Java *> *p1 = [[Personalloc]init];
p1.language = java;
}
#import <Foundation/Foundation.h>
//第一步 宣告泛型
//__covariant 子類轉父類 泛型名字是ObjectType
@interface Person<__covariant ObjectType> : NSObject
// 語言
@property (nonatomic, strong) ObjectType language;
@end
// 子類轉父類
- (void)covariant
{
iOS *ios = [[iOSalloc]init];
Language *language = [[Languagealloc]init];
// iOS 只會iOS
Person<iOS *> *p = [[Personalloc]init];
p.language = ios;
// Language 都會
Person<Language *> *p1 = [[Personalloc]init];
p1 = p;
//如果沒新增協變會報指標型別錯誤警告
}
#import <Foundation/Foundation.h>
//第一步 宣告泛型
//__contravariant 可以逆變,父類轉子類 泛型名字是ObjectType
@interface Person<__contravariant ObjectType> : NSObject
// 語言
@property (nonatomic, strong) ObjectType language;
@end
- (void)contravariant {
//第二步 定義泛型
iOS *ios = [[iOSalloc]init];
Language *language = [[Languagealloc]init];
// 父類轉子類 都會
Person<Language *> *p = [[Personalloc]init];
p.language = language;
// iOS 只會iOS
Person<iOS *> *p1 = [[Personalloc]init];
p1 = p;
//如果沒新增逆變會報指標型別錯誤警告
}
相關文章
- C#泛型的逆變協變(個人理解)C#泛型
- .NET Core CSharp初級篇 1-8泛型、逆變與協變CSharp泛型
- 泛型協變與抗變(二)泛型
- C#深入學習:泛型修飾符in,out、逆變委託型別和協變委託型別C#泛型型別
- 泛型、陣列列表與協變泛型陣列
- Java中的逆變與協變Java
- C#中的協變和逆變C#
- 詳解C#的協變和逆變C#
- 瞭解C#的協變和逆變C#
- .NET C#雜談(1):變體 - 協變、逆變與不變C#
- 你瞭解C#的協變和逆變嗎C#
- 【C#開發】C#的協變和逆變C#
- C#基礎筆記——協變(Covariance)和逆變(Contravariance)C#筆記
- 重學c#系列——逆變和協變[二十四]C#
- java:識別符號 關鍵字 變數Java符號變數
- 企業在轉型(數字化、變革)中的幾個關鍵點
- Python 關鍵字global全域性變數詳解Python變數
- Java之private關鍵字修飾成員變數Java變數
- 教你如何攻克Kotlin中泛型型變的難點(上篇)Kotlin泛型
- 教你如何攻克Kotlin中泛型型變的難點(下篇)Kotlin泛型
- 思維意識轉變是施工企業數字化轉型成敗的關鍵
- java 之泛型與可變引數詳解Java泛型
- 泛函和變分法
- java零基礎自學第七天①,什麼是成員變數和區域性變數,private關鍵字使用,this關鍵字使用Java變數
- 關於泛型泛型
- 教你如何攻克Kotlin中泛型型變的難點(實踐篇)Kotlin泛型
- 膝上型電腦鍵盤字母變數字怎麼按回來變數
- C:static 關鍵字、靜態變數、跨類訪問資料變數
- JavaScript 中 this 關鍵字的作用和如何改變其上下文JavaScript
- DM 關鍵字、遮蔽關鍵字
- python疑問5:位置引數,預設引數,可變引數,關鍵字引數,命名關鍵字引數區別Python
- win10數字小鍵盤變成左右鍵了怎麼辦_win10數字小鍵盤變成方向鍵的解決方法Win10
- 使用 volatile 關鍵字保證變數可見性和禁止指令重排序變數排序
- const關鍵字在C與C++中修飾變數的區別C++變數
- let關鍵字和const關鍵字
- final關鍵字和static關鍵字
- JPEG格式研究——(4)反量化、逆ZigZag變化和IDCT變換
- java基礎語法--註釋、識別符號、關鍵字、資料型別、型別轉換、變數、常量、作用域、運算子Java符號資料型別變數