Swift4.0 学习笔记 第二十一节:构造函数KVC

 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,将父类的代码完全覆盖
    }
}
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 ?
   
}
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 ) " )
       
    }
}

你可能感兴趣的:(Swift知识,KVC构造函数)