objc(iOS,macOS) 用KVC設置結構體git
我花了一些時間完成了這個擴展KeyPathExtension,而且加入了更多的功能。把謂詞功能也和KVC結合在一塊兒了,私覺得這樣的結合並無額外的學習成本和更多代碼開銷,反而讓代碼更加簡潔,但願你們可以給個贊吧。github
實現結構體路徑的擴展思路:數據結構
在Fundation中KVC提供的鍵值路徑只能訪問對象,不能訪問結構體。其實能夠更面向對象。學習
執行下面的語句將會報錯:this
[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的結構體信息,而後拿到關於這個結構體如何取值和賦值的信息。有了這兩條信息就能夠了。spa
最方便的數據結構就是字典,Key是objcType,value用block,裏面放置如何操做傳入的結構體內容。綜合來看這樣基本上也沒什麼很大的開銷。code
@{ @"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]; } , ... ... }