swift 資料模型Modle類

weixin_33797791發表於2018-08-01
2170853-6389fb7d6f007afb.png
image.png

//簡介 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.

}

}

//輸出結果

相關文章