iOS 用KVC設定結構體
阿新 • • 發佈:2018-11-20
iOS 用KVC設定結構體
在Fundation中KVC提供的鍵值路徑只能訪問物件,不能訪問結構體。這很不面向物件。
執行下面的語句將會報錯:
[self setValue:@(100) forKeyPath:@"view.frame.width.x"];
// reason: '[<NSConcreteValue 0x600003466740> valueForUndefinedKey:]: this class is not key value coding-compliant for the key width.'
實現這個功能是很簡單的:首先NSValue的結構體資訊,然後拿到關於這個結構體如何取值和賦值的資訊。有了這兩條資訊就可以了。
最方便的資料結構就是字典,Key是objcType,value用block,裡面放置如何操作傳入的結構體內容。綜合來看這樣基本上也沒什麼很大的開銷。
@{ @"size" : ^(NSValue* value){ return [NSValue valueWithCGSize:[value CGRectValue].size]; } , ... ... }
@{ @"size" : ^(NSValue* value , id newValue){ CGRect rect= [value CGRectValue]; rect.size = [newValue CGSizeValue]; return [NSValue valueWithCGRect:rect]; } , ... ... }
我花了一些時間完成了這個擴充套件AkvcExtension,並且加入了更多的功能。把謂詞功能也和KVC結合在一起了,私以為這樣的結合並沒有額外的學習成本和更多程式碼開銷,反而讓程式碼更加簡潔,希望大家能夠給個贊吧。