Objective-C語法之KVC

Key-Value-Coding(KVC)鍵值編碼來訪問你要存取的類的屬性。編碼

KVC

使用KVC

定義Student類spa

//Student.h
#import <Foundation/Foundation.h>

@interface Student : NSObject {
    NSString *name;
}
@end

//  Student.m
//  KVCDemo
//
//  Created by Michael on 2016/9/30.
//  Copyright © 2016年 Michael. All rights reserved.
//

#import "Student.h"

@implementation Student

@end

.m文件也沒有實現。name屬性沒有加property,原來的訪問方法就訪問不了name屬性了。怎麼辦呢?用kvc就能夠了code

void doKVC() {
    Student *stu = [[Student alloc] init];
    [stu setValue:@"liuguoquan" forKey:@"name"]; //存的時候key和類屬性的名稱必須一致
    NSString *name = [stu valueForKey:@"name"];
    NSLog(@"姓名: %@",name);
}

2016-10-10 11:50:47.338037 KVCDemo[17719:1396152] 姓名: liuguoquan

鍵路徑訪問屬性

若是訪問這個類裏中的屬性中的屬性呢?那就用到了鍵路徑rem

  • 關鍵字:鍵路徑取值valueForKeyPath數學

  • 鍵路徑存值:forKeyPathit

新建一個類Course,課程類,課程類有課程名稱這個屬性io

//  Course.h
//  KVCDemo
//
//  Created by Michael on 2016/9/30.
//  Copyright © 2016年 Michael. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface Course : NSObject

@end

//  Course.m
//  KVCDemo
//
//  Created by Michael on 2016/9/30.
//  Copyright © 2016年 Michael. All rights reserved.
//

#import "Course.h"

@implementation Course {
    NSString *courseName;
}

@end

在Student中添加Course屬性 ,student.h文件中代碼以下:class

#import <Foundation/Foundation.h>
@class Course;

@interface Student : NSObject {
    NSString *name;
    Course *course;
}

@end

在main方法中,咱們經過鍵路徑訪問Course中courseName的屬性import

void doRead() {
    
    Student *stu = [[Student alloc] init];
    [stu setValue:@"liuguoquan" forKey:@"name"];
    NSString *name = [stu valueForKey:@"name"];
    NSLog(@"姓名: %@",name);
    
    //給類中的類成員變量賦值
    Course *course = [[Course alloc] init];
    [course setValue:@"語文" forKey:@"courseName"];
    [stu setValue:course forKey:@"course"];
    NSString *courseName = [stu valueForKeyPath:@"course.courseName"];
    NSLog(@"課程: %@",courseName);
    
    //也能夠這樣存值
    [stu setValue:@"數學課" forKeyPath:@"course.courseName"];
    courseName = [stu valueForKeyPath:@"course.courseName"];
    NSLog(@"課程名稱:%@", courseName);

}

2016-10-10 11:50:47.339847 KVCDemo[17719:1396152] 姓名: liuguoquan
2016-10-10 11:50:47.340082 KVCDemo[17719:1396152] 課程: 語文
2016-10-10 11:50:47.340166 KVCDemo[17719:1396152] 課程名稱:數學課

自動封裝基本數據類型

在Student類中添加屬性 NSInteger point變量

#import <Foundation/Foundation.h>
@class Course;

@interface Student : NSObject {
    NSString *name;
    Course *course;
    NSInteger point;
}

@end
//自動封裝基本數據類型
void doRead2() {
    Student *stu = [[Student alloc] init];
    [stu setValue:@"liuguoquan" forKey:@"name"];
    NSString *name = [stu valueForKey:@"name"];
    NSLog(@"姓名: %@",name);
    
    //給類中的類成員變量賦值
    Course *course = [[Course alloc] init];
    [course setValue:@"語文" forKey:@"courseName"];
    [stu setValue:course forKey:@"course"];
    NSString *courseName = [stu valueForKeyPath:@"course.courseName"];
    NSLog(@"課程: %@",courseName);
    
    //咱們用NSString*類型設置的屬性值@"99",而咱們的屬性是NSInteger類型的,存取都沒有問題。
    [stu setValue:@"99" forKey:@"point"];
    NSString *point = [stu valueForKey:@"point"];
    NSLog(@"分數: %@",point);
}

2016-10-10 11:50:47.340190 KVCDemo[17719:1396152] 姓名: liuguoquan
2016-10-10 11:50:47.340210 KVCDemo[17719:1396152] 課程: 語文
2016-10-10 11:50:47.340393 KVCDemo[17719:1396152] 分數: 99
相關文章
相關標籤/搜索