keypath擴展/iOS 用KVC設置結構體

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];
    } ,
    ... ...
}
相關文章
相關標籤/搜索