1.首先创建一个Person的类 继承NSObject类
//
// Person.swift
// 008-构造函数(KVC)
//
// Created by 庄壮勇 on 2018/1/9.
// Copyright © 2018年 Personal. All rights reserved.
//
import UIKit
/**
1. 定义属性的时候,如果是对象,通常都是可选的
- 在需要的时候创建
- 避免写构造函数,可以简化代码
2. 使用KVC 方法之前,应该调用 super.init 保证对象实例化
3. KVO 又是一个纯 OC 的特性,所以如果是 swift class 需要在声明的时候增加 @objcMembers 关键字。否则在运行的时候你会得到一个 error:fatal error: Could not extract a String from KeyPath Swift.ReferenceWritableKeyPath
4. 另外一件事就是被观察的属性需要用dynamic修饰,否则也无法观察到。
5. 如果是基本数据类型,不能设置成可选的,而且要设置初始值,否则KVC会崩溃,
6. 如果需要使用KVC设置数值,属性不能是 private的
*/
@objcMembers class Person: NSObject {
// name 属性是可选的,在OC中 很多的属性都是在需要的时候创建的
// 例如 vc.view / tableViewCell / detailLabel / imageView
// 因为在手机开发,内存很宝贵,有些属性并不是一定需要分配空间的
// 延迟加载,在需要的时候再创建!
dynamic var name: String ?
// 给基本数据类型属性初始化
// - 使用KVC会提示无法找到age 的 KEY
// - 原因: Int 是一个基本数据类型的结构体,OC中没有,OC 中只有基本数据类型!
// dynamic var age: Int?
dynamic var age: Int = 0
// - 如果是private 属性, 使用KVC设置值的时候,同样无法设置
dynamic var title: String ?
init (dict: [ String : Any ]){
// 保证对象已经完全初始化完成!
super . init ()
// 'self' used before super.init call
// 使用self 的方法 **之前**,应该调用super.init
// KVC 的方法,是OC的方法,在运行时给对象发送消息
// 要求对象已经实例化完成!
setValuesForKeys (dict)
}
// 重写父类的方法
override func setValue( _ value: Any ?, forUndefinedKey key: String ) {
// 没有调用 super,将父类的代码完全覆盖
// Person.swift
// 008-构造函数(KVC)
//
// Created by 庄壮勇 on 2018/1/9.
// Copyright © 2018年 Personal. All rights reserved.
//
import UIKit
/**
1. 定义属性的时候,如果是对象,通常都是可选的
- 在需要的时候创建
- 避免写构造函数,可以简化代码
2. 使用KVC 方法之前,应该调用 super.init 保证对象实例化
3. KVO 又是一个纯 OC 的特性,所以如果是 swift class 需要在声明的时候增加 @objcMembers 关键字。否则在运行的时候你会得到一个 error:fatal error: Could not extract a String from KeyPath Swift.ReferenceWritableKeyPath
4. 另外一件事就是被观察的属性需要用dynamic修饰,否则也无法观察到。
5. 如果是基本数据类型,不能设置成可选的,而且要设置初始值,否则KVC会崩溃,
6. 如果需要使用KVC设置数值,属性不能是 private的
*/
@objcMembers class Person: NSObject {
// name 属性是可选的,在OC中 很多的属性都是在需要的时候创建的
// 例如 vc.view / tableViewCell / detailLabel / imageView
// 因为在手机开发,内存很宝贵,有些属性并不是一定需要分配空间的
// 延迟加载,在需要的时候再创建!
dynamic var name: String ?
// 给基本数据类型属性初始化
// - 使用KVC会提示无法找到age 的 KEY
// - 原因: Int 是一个基本数据类型的结构体,OC中没有,OC 中只有基本数据类型!
// dynamic var age: Int?
dynamic var age: Int = 0
// - 如果是private 属性, 使用KVC设置值的时候,同样无法设置
dynamic var title: String ?
init (dict: [ String : Any ]){
// 保证对象已经完全初始化完成!
super . init ()
// 'self' used before super.init call
// 使用self 的方法 **之前**,应该调用super.init
// KVC 的方法,是OC的方法,在运行时给对象发送消息
// 要求对象已经实例化完成!
setValuesForKeys (dict)
}
// 重写父类的方法
override func setValue( _ value: Any ?, forUndefinedKey key: String ) {
// 没有调用 super,将父类的代码完全覆盖
}
}
2.创建一个Student类继承于Person类
//
// Student.swift
// 008-构造函数(KVC)
//
// Created by 庄壮勇 on 2018/1/9.
// Copyright © 2018年 Personal. All rights reserved.
//
import UIKit
class Student: Person {
dynamic var no: String ?
// Student.swift
// 008-构造函数(KVC)
//
// Created by 庄壮勇 on 2018/1/9.
// Copyright © 2018年 Personal. All rights reserved.
//
import UIKit
class Student: Person {
dynamic var no: String ?
}
3.在ViewController上调用
//
// ViewController.swift
// 008-构造函数(KVC)
//
// Created by 庄壮勇 on 2018/1/9.
// Copyright © 2018年 Personal. All rights reserved.
//
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super . viewDidLoad ()
let p = Student (dict: [ "name" : "老张" , "age" : 109 , "title" : "BOSS" , "no" : "001" , "XXX" : "ABC" ])
print ( " \ ( p. name ) \ ( p. age ) \ ( p. title ) \ ( p. no ) " )
}
// ViewController.swift
// 008-构造函数(KVC)
//
// Created by 庄壮勇 on 2018/1/9.
// Copyright © 2018年 Personal. All rights reserved.
//
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super . viewDidLoad ()
let p = Student (dict: [ "name" : "老张" , "age" : 109 , "title" : "BOSS" , "no" : "001" , "XXX" : "ABC" ])
print ( " \ ( p. name ) \ ( p. age ) \ ( p. title ) \ ( p. no ) " )
}
}