构造函数- -KVC构造函数

本文详细介绍了Swift中KVC构造函数的使用方法,包括如何通过字典设置模型对象的属性,以及KVC在对象赋值过程中的作用。通过实例代码展示了如何利用KVC进行属性初始化,并对构造函数调用顺序进行了调试。

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

/**

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

    1. 给属性分配空间

    2. 设置初始数值


    Swift 中构造函数`` init


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


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

    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)")
     
    }
}


132208_R8je_2432308.png



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)")
    }
}


140125_0MCn_2432308.png


141101_zm6e_2432308.png


140132_1VAR_2432308.png





转载于:https://my.oschina.net/TaciturnKnightYQ/blog/539278

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值