构造函数- -KVC构造函数

构造函数---KVC构造函数swift

/**ide

    构造函数  创建一个`对象`函数

    1. 给属性分配空间spa

    2. 设置初始数值设计


    Swift 中构造函数`` init调试


    重载:OC中没有重载的概念code


    函数名相同,参数的个数&类型不一样,叫作重载,是面向对象设计语言必备标志!orm

    OC 中使用 initWithXXX的方式替代对象

*/开发

//  Person.swift

import UIKit
class Person: NSObject {
    
    // 对象的属性就是应该可变的
    // 可选项,容许变量为空,var 的默认值就是 nil
    // 在 iOS 开发中,全部的属性是延迟加载的
    var name: String?
    
    // age 和 KVC 不兼容,OC中Int属于基本数据类型,不存在 `nil` 的概念
    var age: Int = 0
    
    /// KVC 的构造函数,用字典设置模型
    init(dict: [String: AnyObject]) {
        
        // KVC 是 OC 特有的,本质是在运行时,动态的给`对象`发送 `setVaule:forKey:` 消息
        // 设置数值 - 调用 super.init 保证对象已经被建立完成
        super.init()
        
        // KVC 的设置数值
        setValuesForKeysWithDictionary(dict)
    }
    
   
}


//  ViewController.swift

import UIKit
// 提示:在 Swift 中,默认全部的属性和方法,都是全局共享的,不须要 import,能够直接使用
class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let p = Student(dict: ["name": "zhangsan", "age": 19])
       print("\(p.name) --- \(p.age)")
     
    }
}





KVC函数调用顺序调试

//  Person.swift
import UIKit
class Person: NSObject {
    
    // 对象的属性就是应该可变的
    // 可选项,容许变量为空,var 的默认值就是 nil
    // 在 iOS 开发中,全部的属性是延迟加载的
    var name: String?
    
    // age 和 KVC 不兼容,OC中Int属于基本数据类型,不存在 `nil` 的概念
    var age: Int = 0
    
    /// KVC 的构造函数,用字典设置模型
    init(dict: [String: AnyObject]) {
        
        // KVC 是 OC 特有的,本质是在运行时,动态的给`对象`发送 `setVaule:forKey:` 消息
        // 设置数值 - 调用 super.init 保证对象已经被建立完成
        super.init()
        
        // KVC 的设置数值
        setValuesForKeysWithDictionary(dict)
    }
    
    override func setValue(value: AnyObject?, forKey key: String) {
        print("forKey \(key) - \(value)")
        
        super.setValue(value, forKey: key)
    }
    
    /// 默认的 setValue forUndefinedKey 方法若是出现未定义的key会抛出 `NSUndefinedKeyException`异常,让程序崩溃
    /// 若是一旦重写了此方法,同时不 super,不调用父类默认的方法!
    override func setValue(value: AnyObject?, forUndefinedKey key: String) {
        print("forUndefinedKey \(key) \(value)")
    }
}


//  ViewController.swift
import UIKit
// 提示:在 Swift 中,默认全部的属性和方法,都是全局共享的,不须要 import,能够直接使用
class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let p = Student(dict: ["name": "网舞", "age": 19, "title": "hahah", "no": "009"])
        print("\(p.name) --- \(p.age)")
    }
}




相关文章
相关标签/搜索