//简介 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 =""
/// 这边定义一个在字典里面的key是swift中的关键字的属性
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 = valueas! String
}
}
/**
写一个构造函数主要目的是让其初始化的时候就有进行模型赋值不然一般步骤是创建这个模型然后模型进行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.
}
}
//输出结果