2016-08-28 36 views
0

比方说,我有一个叫人等级:如何在创建类对象时处理缺失值?

class Person: NSObject { 
    let name:String 
    let gender:String 
    let age:Int 

    init(name: String, gender: String, age: Int) { 
     self.name = name 
     self.gender = gender 
     self.age = age 
    } 

    class func createPerson(person:[String:AnyObject]) -> Person { 
     let name = person["name"] as? String 
     let gender = person["gender"] as? String 
     let age = person["age"] as? Int 

     return Person(name: name!, gender: gender!, age: age!) 
    } 
} 

我检索一个JSON终点,我想转换为类“人”的对象的数据。我使用类函数“createPerson”来做到这一点。

处理URL端点缺少值的情况的最佳方式是什么?

至于我的代码目前维持,这条线将如果值之一是缺少程序崩溃:

return Person(name: name!, gender: gender!, age: age!) 

我知道这是因为我力展开的变量,但我应该怎么构建我的代码说明变量值可能丢失的事实?

我应该声明一切为可选吗?

let name:String? 
let gender:String? 
let age:Int? 

init(name: String?, gender:String?, age:Int?) { 
    self.name = name 
    self.gender = gender 
    self.age = age 
} 

建议表示赞赏。谢谢!

+0

哟你可以使用使用ObjectMapper,并且无需声明为可选 – Byte

回答

1

无需编写类的功能来创建自定义的初始化:

let entity = Person() 
if let name = person["name"] as? String { 
    entity.name = name 
} 
if let gender = person["gender"] as? String { 
    entity.gender = gender 
} 
if let age = person["age"] as? Int { 
    entity.age = age 
} 
+0

我不需要一个自定义的初始化代码清洁? – user3353890

+0

@ user3353890没有。自定义init不会使代码更清晰,除非您在项目中的多个位置初始化对象。 –

+0

谢谢!这很容易成长 – user3353890

1

这里是你使用对象映射

import Foundation 
import ObjectMapper 

class PersonMapping: Mappable { 

// MARK: - Variables & Constants  

var name : String 
var gender : String 
var age : Int 

required init?(_ map: Map) { 

name = "" 
gender = "" 
age = 0 

} 

func mapping(map: Map) { 

    name     <- map["name"] 
    gender     <- map["gender"] 
    age      <- map["age"] 

} 
} 

的一个例子,你可以用它作为

// result is your JSON object 
if let data = Mapper<PersonMapping>().map(result){ 
       print(data.name) 
       print(data.gender) 
       print(data.age) 

      } 

希望它有帮助:-)

+0

谢谢你的答案!我选择了下面的方法,但我感谢你的时间和工作! :) – user3353890