私有變量訪問及賦值

首先來看看KVC的其餘用處及簡介

1、 KVC介紹

kvc就是鍵值編碼(key-value),說白了就是經過指定的key得到想要的值value。而不是經過調用Setter、Getter方法訪問。*web

2、 KVC的強大之處

1 .訪問私有變量

一個類中的私有變量,不能直接經過Setter、Getter方法訪問。可是卻能夠經過KVC來訪問。舉例:json

一個類以下:編碼

@interface Dog : NSObject
{
    @private
    double height;
}

這裏的私有變量 height ,假如直接使用Setter、Getter方法訪問,就會出現下面的錯誤。spa

這時候能夠使用KVC來訪問這個私有變量:code

Dog *dog = [[Dog alloc]init];
[dog setValue:@12 forKey:@"height"];//給私有變量賦值 NSLog(@"dog's height is = %@",[dog valueForKey:@"height"]);//讀取私有變量的值
  • 實際使用舉例orm

    利用kvc的這個特性,咱們能夠訪問系統裏的一些私有變量。blog

    例如:在UIPageControl裏面有兩個私有變量:ci

UIImage*        _currentPageImage;
UIImage*        _pageImage;

咱們能夠經過kvc來進行讀取和賦值:it

UIPageControl *pageControl = [[UIPageControl alloc]init];
//設置值
[pageControl setValue:[UIImage imageNamed:@"XX"] forKeyPath:@"_currentPageImage"];

[pageControl setValue:[UIImage imageNamed:@"XX"] forKeyPath:@"_pageImage"];
//讀取值
UIImage *currentImage = [pageControl valueForKey:@"_currentPageImage"]; UIImage *pageImage = [pageControl valueForKey:@"_pageImage"];

這樣咱們就能夠設置當前顯示和未顯示到腳標的樣式了。io

2. 使用KVC直接訪問 NSArray 或者 NSSet 的屬性值

NSArray/NSSet等都支持KVC,這裏舉一個例子:

NSArray *books= @[book1, book2, book3];
NSArray *names = [books valueForKeyPath:@"name"]; NSLog(@"%@", [books valueForKeyPath:@"@avg.price"]);//使用kvc直接打印出來書的平均價格

其中,book是一個書類,有一個屬性是name,一個屬性是price。

3. 使用KVC將字典(json)轉化成模型

// 定義一個字典
 NSDictionary *dict = @{
         @"name"  : @"jack",
         @"money" : @"20.7",
      };
 // 建立模型
 Person *p = [[Person alloc] init];
 // 字典轉模型
 [p setValuesForKeysWithDictionary:dict];
 NSLog(@"person's name is the %@",p.name);
}

注意:

(1). key的值必須正確,若是拼寫錯誤,會出現異常

(2). 當key的值是沒有定義的,valueForUndefinedKey:這個方法會被調用,若是你本身寫了這個方法,key的值出錯就會調用到這裏來

(3). 由於類key反覆嵌套,因此有個keyPath的概念,keyPath就是用.號來把一個一個key連接起來,這樣就能夠根據這個路徑訪問下去

(4). NSArray/NSSet等都支持KVC

相關文章
相關標籤/搜索