iOS小技能之字典轉(zhuǎn)模及對象相等性示例詳解
前言
字典轉(zhuǎn)模型
/** 通常實現(xiàn)字典實例化模型,都實現(xiàn)了以下模型的實例化方法*/ //使用字典實例化模型 - (instancetype) initWithDictionary :(NSDictionary *) appDictionary; //類方法可以快速實例化一個對象--把代碼放在它最應(yīng)該呆的地方 + (instancetype) appInfoWithDictionary : (NSDictionary *) appDictionary; //返回plist文件對應(yīng)的模型數(shù)組 ,使用懶加載
KVC的賦值
- (instancetype) initWithDictionary:(NSDictionary *)appDictionary{
//self is object
self = [super init];
if (self) {//既然nil解析成NO,所以沒有必要在條件語句比較。不要拿某樣?xùn)|西直接與YES比較,因為YES被定義為1
//init local vars 將plist文件的信息在此處進(jìn)行字典轉(zhuǎn)模型
//KVC (key value coding) 鍵值編碼:是一種間接修改、讀取對象屬性的一種方法;KVC被稱為cocoa的大招
[self setValuesForKeysWithDictionary:appDictionary];//本質(zhì)上是調(diào)用 self setValue:<#(nullable id)#> forUndefinedKey:(nonnull NSString *)
}
return self;
}
I 字典轉(zhuǎn)模型
- 使用字典的壞處
通常取出和修改數(shù)據(jù)字典的數(shù)據(jù),都要通過編寫“字符串類型”的key值-》編輯器IDE沒有智能提示、手動寫key容易寫錯,且此時IDE不會有任何的警告和報錯。 字典的使用例子
dict[@"name"] = @"Jack"; NSString *name = dict[@"name"];
- 使用數(shù)據(jù)模型的好處
1)數(shù)據(jù)模型(專門用來存放數(shù)據(jù)的對象),使用數(shù)據(jù)模型表示數(shù)據(jù)更專業(yè)些
2)使用模型修改數(shù)據(jù)、讀取數(shù)據(jù)均采用對象的屬性,提高編寫效率
1.1 字典轉(zhuǎn)模型的實現(xiàn)步驟
1)字典轉(zhuǎn)模型的過程,通常被封裝在模型內(nèi)部
2)模型應(yīng)該提供一個“帶有NSDictionary類型”參數(shù)的構(gòu)造方法
- (instancetype)initWithDict:(NSDictionary*)dict; + (instancetype)xxxWithDict:(NSDictionary*)dict;
1.2 字典轉(zhuǎn)模型的過程
- [采用KVC(keyValueCoding)實現(xiàn)] plist文件解析-》字典數(shù)組(NSDictionary)-》模型數(shù)組(AppInfo)
使用字典實例化模型 (把代碼放在它最應(yīng)該呆的地方)
- (instancetype) initWithDictionary:(NSDictionary *)appDictionary{
//self is object
self = [super init];
if (self) {//既然nil解析成NO,所以沒有必要在條件語句比較。不要拿某樣?xùn)|西直接與YES比較,因為YES被定義為1
//init local vars 將plist文件的信息在此處進(jìn)行字典轉(zhuǎn)模型
//KVC (key value coding) 鍵值編碼:是一種間接修改、讀取對象屬性的一種方法;KVC被稱為cocoa的大招
[self setValuesForKeysWithDictionary:appDictionary];
}
return self;
}
//使用類方法實現(xiàn)“字典實例化模型”--地道的代碼
+ (instancetype) appInfoWithDictionary:(NSDictionary *)appDictionary{
//self is class
return [[self alloc]initWithDictionary:appDictionary];//+ (instancetype)alloc Description Returns a new instance of the receiving class.
}
@end
- 使用KVC的注意事項:
1、plist文件中的鍵值名稱必須與模型對象的屬性名稱一致
2、模型中的屬性,可以不全部出現(xiàn)在plist文件中
II 對象的相等性 & 本體性
一個對象的本體和它的內(nèi)存地址是相關(guān)聯(lián)的。 NSObject 的isEqual:本質(zhì)上是對本體性的檢查,即兩個 NSObject 如果指向了同一個內(nèi)存地址,那它們就被認(rèn)為是相同的。
當(dāng)兩個物體有一系列相同的可觀測的屬性時,兩個物體可能是互相相等 。
2.1 相等性檢查
對象相等性檢查的主要應(yīng)用場景:確定一個對象是不是一個集合的成員,對于 NSArray,NSDictionary 和 NSString 容器類來說,更加有用的是進(jìn)行相等性檢查,即對于集合中的每個成員進(jìn)行判斷,因此我們需要重寫isEqual: 。
重寫 isEqual:
- 先進(jìn)行本體性檢查,如果失敗,就進(jìn)行實際內(nèi)容(意義)上的比較,比如判斷其中幾個主要特性的屬性。
- (BOOL)isEqual:(id)object {
if (self == object) {
return YES;
}
if (![object isKindOfClass:[Person class]]) {
return NO;
}
return [self isEqualToPerson:(Person *)object];//關(guān)鍵屬性的判斷,比如身份證ID
}
- 重寫 hash 方法,便于快速地(O(1)) 進(jìn)行元素查找。
相對于數(shù)組把元素按順序存儲(0, 1, ..., n-1),散列表在內(nèi)存中分配 n 個位置,然后使用一個散列函數(shù)來計算出位置范圍之內(nèi)的某個具體位置。
hash 得到的值不必是唯一可區(qū)分的,如果發(fā)生了散列碰撞,散列表會從碰撞產(chǎn)生的位置開始向后尋找,把新的元素放在第一個可供放置的位置。
@implementation NSDate (ex)
- (NSUInteger)hash {
return (NSUInteger)abs([self timeIntervalSinceReferenceDate]);
}
對關(guān)鍵屬性的散列值進(jìn)行一個簡單的二進(jìn)制移位操作,即可簡單的實現(xiàn)對象的hash 函數(shù):
@implementation UIColor (ex)
/**
>左移運(yùn)算符(<<):按二進(jìn)制形式把所有的數(shù)字向左移動對應(yīng)的位數(shù),高位移出(舍棄),低位的空位補(bǔ)零。
*/
- (NSUInteger)hash {
CGFloat red, green, blue;
[self getRed:&red green:&green blue:&blue alpha:nil];
return ((NSUInteger)(red * 255) << 16) + ((NSUInteger)(green * 255) << 8) + (NSUInteger)(blue * 255);
}
@end
對關(guān)鍵屬性的散列值進(jìn)行一個簡單的XOR操作
/**
異或 ^ 相同為0,不相同為1;
應(yīng)用場景:密碼加密、散列值計算。
*/
- (NSUInteger)hash {
return [self.id hash] ^ [self.birthday hash];
}
2.2 Foundation 框架中,自己實現(xiàn)的相等性檢查
NSAttributedString -isEqualToAttributedString:
NSData -isEqualToData:
NSDate -isEqualToDate:
NSDictionary -isEqualToDictionary:
NSHashTable -isEqualToHashTable:
NSIndexSet -isEqualToIndexSet:
NSNumber -isEqualToNumber:
NSOrderedSet -isEqualToOrderedSet:
NSSet -isEqualToSet:
NSString -isEqualToString:
NSTimeZone -isEqualToTimeZone:
NSValue -isEqualToValue:
2.3 字符串駐留
字符串駐留的優(yōu)化技術(shù): 把一個不可變字符串對象的值拷貝給各個不同的指針。
Objective-C 選擇器的名字也是作為駐留字符串儲存在一個共享的字符串池當(dāng)中的。
NSString *stra = @"Hello"; NSString *strb = @"Hello"; BOOL wt = (stra == strb); // YES
選擇器的比較
OBJC_EXPORT BOOL
class_respondsToSelector(Class _Nullable cls, SEL _Nonnull sel)
OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0);
- (BOOL)respondsToSelector:(SEL)aSelector;
if([device respondsToSelector:@selector(setSmoothAutoFocusEnabled:)]){
}
III 代碼重構(gòu)(前提是已經(jīng)實現(xiàn)了基本功能)
開發(fā)前:設(shè)定開發(fā)計劃、步驟 開發(fā)過程中:每一個步驟告一段落之后,我們要暫停,進(jìn)行代碼審核,有針對性的重構(gòu)(抽離重復(fù)代碼,模型和視圖各盡職責(zé))
代碼重構(gòu)的原則: 把代碼放在它最應(yīng)該呆的地方
1、使用類方法實現(xiàn)字典實例化模型 (模型,通常是plist文件,網(wǎng)絡(luò))
使用類方法實例化模型數(shù)組
//類方法可以快速實例化一個對象--把代碼放在它最應(yīng)該呆的地方 + (instancetype) appInfoWithDictionary : (NSDictionary *) appDictionary; //返回plist文件對應(yīng)的模型數(shù)組 ,使用懶加載 + (NSArray *)appList;
2、使用類方法實例化視圖對象,并用數(shù)據(jù)模型裝配視圖內(nèi)容
用類方法進(jìn)行視圖的實例化
+ (instancetype) appView;//使用類方法加載xib + (instancetype) appViewWithAppInfo:(KNAppInfo *) appInfo;//使用類方法加載xib,參數(shù)用于視圖的數(shù)據(jù)裝配
see also
更多內(nèi)容請關(guān)注 #小程序:iOS逆向,只為你呈現(xiàn)有價值的信息,專注于移動端技術(shù)研究領(lǐng)域;

以上就是iOS小技能之字典轉(zhuǎn)模及對象相等性示例詳解的詳細(xì)內(nèi)容,更多關(guān)于iOS字典轉(zhuǎn)模對象相等性的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
iOS實現(xiàn)錄音轉(zhuǎn)碼MP3及轉(zhuǎn)碼BASE64上傳示例
本篇文章主要介紹了iOS實現(xiàn)錄音轉(zhuǎn)碼MP3及轉(zhuǎn)碼BASE64上傳示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-02-02
解決蘋果ios用js的Date()出現(xiàn)NaN的問題
下面小編就為大家分享一篇解決蘋果ios用js的Date()出現(xiàn)NaN的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-03-03
iOS swift實現(xiàn)轉(zhuǎn)場動畫的方法示例
在平時的iOS開發(fā)中,我們進(jìn)行界面跳轉(zhuǎn)時一般都是采用系統(tǒng)默認(rèn)的轉(zhuǎn)場動畫,而下面這篇文章主要給大家介紹了關(guān)于iOS利用swift實現(xiàn)轉(zhuǎn)場動畫的方法示例,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來一起看看吧。2017-07-07
iOS開發(fā)--仿新聞首頁效果WMPageController的使用詳解
這篇文章主要介紹了iOS開發(fā)--仿新聞首頁效果WMPageController的使用詳解,詳解的介紹了iOS開發(fā)中第三方庫WMPageController控件的使用方法,有需要的可以了解下。2016-11-11

