【问题标题】:How do I handle missing values when creating a class object?创建类对象时如何处理缺失值?
【发布时间】:2016-08-28 04:43:22
【问题描述】:

假设我有一个名为 person 的类:

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

我从要转换为“Person”类对象的 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
}

不胜感激。谢谢你!

【问题讨论】:

  • 你可以使用 ObjectMapper 并且不需要在那里声明为可选

标签: ios json swift optional


【解决方案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
}

【讨论】:

  • @user3353890 不。自定义初始化不会使您的代码更清晰,除非您在项目的多个位置初始化一个对象。
【解决方案2】:

这是一个使用对象映射器的示例

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)

            }

希望对你有帮助:-)

【讨论】:

  • 感谢您的回答!我选择使用以下方法,但我感谢您的时间和工作! :)
猜你喜欢
  • 2015-12-22
  • 1970-01-01
  • 1970-01-01
  • 2020-09-04
  • 2021-12-23
  • 2020-09-24
  • 1970-01-01
  • 2014-04-26
  • 1970-01-01
相关资源
最近更新 更多