swift_039(Swift中的KVC的使用方法)

KVC简单介绍
  • KVC是OC特有的,KVC本质上是在运行时,动态向对象发送setValue:ForKey:方法,为对象的属性设置数值
    因此,在使用KVC的方法之前,需要确保对象已经被正确实例化
    • 在Swift中,如果属性是可选的,在初始化时,不会为该属性分配空间。
    • 在OC中,基本数据类型就是保存一个值,不存在可选的概念
    • 所以我们需要给可选的基本数据类型设置一个初始值,否则使用KVC就会报错。
      如果想要在Swift中使用KVC,这个类必须要继承自NSOject,因为KVC是OC的东西。
Swift中正确使用KVC的方式:
class Person:NSObject {

    var name:String?
//给可选基本类型一个初始值
    var age:Int? = 0

    init(dict:[String:AnyObject]) {
        super.init()
        setValuesForKeysWithDictionary(dict)
    }
}
KVC函数的调用顺序:
  • setValuesForKeysWithDictionary会按照字典中的key重复调用setValue:ForKey:函数
  • 在重复调用的过程中,如果发现字典中对应的key在类中没有对应的属性,就会调用setValue:forUndefinedKey:函数去处理这个情况。如果没有实现setValue:forUndefinedKey:函数时,会抛出NSUndefinedKeyException,程序崩溃。
    所以应该根据具体的项目需求,来实现setValue:forUndefinedKey:函数
    如果父类实现了setValue:forUndefinedKey:,子类不必再次实现这个方法了
例子:

//简介 oc是一个面向对象即模型的开发,一般规范的开发都是以模型作为对象进行开发的。那么在Swift中模型也同样重要下面介绍一下模型的赋值

1.介绍下 模型一键赋值的代码 setValuesForKeyWithDictionary 这句话的作用 是把字典Dictionary中的key对应的Value 赋值给模型中的与key一样的属性

1)分三种情况 第一种情况是 模型中的属性等于 字典中的额key 并且一一对应 那么可以赋值

2)第二种 模型中的属性大于字典中的key即模型除了与字典一一对应的属性之外还有其他属性 那么这个赋值也有用

3)第三种 模型中的属性小于或者字典中存在模型中没有的属性名字 那么就会报错

2.针对第三种情况 解决办法是  在模型中加上这句话就可以了 不要进行任何操作

override func setValue(value:AnyObject?, forUndefinedKey key:String) {

}
下面附上代码例子
//这边是创建一个简单 Person的模型 然后在界面赋值

import UIKit


class PersonModel: NSObject {


    //这是一个Person模型

    /// 年龄

    var age:Int =0

    /// 姓名

    var name:String =""

    /// 性别

    var sex:String =""

    /// 这边定义一个在字典里面的keyswift中的关键字的属性

    var undefine:String =""

    

    /**

     这个方法是防止使用setvalueforkeysWithDictionary的时候字典里的key在模型里面没有处理方法一般是把方法写出来里面不用写东西这样字典里出现模型没有的key的时候不会报错也不会赋值(除非像下面自己手动赋值)

     

     - parameter value: 模型中未定义的key值对应的value

     - parameter key:   模型中未定义的key值或者跟跟关键字冲突的字典的key

     */

    overridefunc setValue(value: AnyObject?, forUndefinedKey key:String) {

        if key =="Int"

        {

            undefine = valueasString

        

        }

    }

    

    /**

     写一个构造函数主要目的是让其初始化的时候就有进行模型赋值不然一般步骤是创建这个模型然后模型进行setvaluesForkeywithdictionary

     

     - returns: 返回赋值后的模型

     */

    overrideinit() {

        super.init()

        let dic = ["age":18,"name":"Clement","sex":"man","Int":"test"]

        //模型一键赋值这个其实是运用了kvc的原理

        self.setValuesForKeysWithDictionary(dic)

        

    }

    /**

     这边是自定义的构造函数可以从外面传参使其初始化

     

     - parameter dic: 初始化模型的字典

     

     - returns: 返回赋值后的模型

     */

    init(dic:[String:AnyObject])

    {

        super.init()

        //模型一键赋值这个其实是运用了kvc的原理

        self.setValuesForKeysWithDictionary(dic)

    

    }

    

}





import UIKit


class ViewController: UIViewController {


    overridefunc viewDidLoad() {

        super.viewDidLoad()

    

        //方式1用构造函数初始化并打印结果这个是自带的模型

        let personOne =PersonModel()

        print("模型的参数\(personOne.age\(personOne.name\(personOne.sex\(personOne.undefine)")

        

        //方式二用自定义的构造函数

        let dic = ["age":28,"name":"Clement__","sex":"man__ ","Int":"nuewtype"]

        let personTwo =PersonModel.init(dic: dic)

        print("模型TWO的参数\(personTwo.age\(personTwo.name\(personTwo.sex\(personTwo.undefine)")

        

        //方式三不写构造函数(即不用init

        let personThree =PersonModel()

        let dicThree = ["age":38,"name":"Clement__three","sex":"man__Three","Int":"nuewtype_three"]

        //外部对模型进行赋值

        personThree.setValuesForKeysWithDictionary(dicThree)

        print("模型Three的参数\(personThree.age\(personThree.name\(personThree.sex\(personThree.undefine)")

    }


    overridefunc didReceiveMemoryWarning() {

        super.didReceiveMemoryWarning()

        // Dispose of any resources that can be recreated.

    }



}


//输出结果

模型的参数18  Clement  man  test

模型TWO的参数28  Clement__  man__   nuewtype

模型Three的参数38  Clement__three  man__Three  nuewtype_three



你可能感兴趣的:(Swift,3.0语法学习)