1. 程式人生 > >iOS 用KVC設定結構體

iOS 用KVC設定結構體

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結合在一起了,私以為這樣的結合並沒有額外的學習成本和更多程式碼開銷,反而讓程式碼更加簡潔,希望大家能夠給個贊吧。