gpt4 book ai didi

接受带有可选参数的 JSON 的 Swift 3 init 方法

转载 作者:搜寻专家 更新时间:2023-10-31 22:28:55 24 4
gpt4 key购买 nike

根据 Leo Dabus 在这里的出色建议 How to insert into Sqlite with optional parameters using Swift 3 ,我修改了我的类以允许可选参数。但是,我有一个方便的方法(如下所示),它接受一个 JSON 字符串来初始化对象。但是,如果您查看最底部的 self.init,它需要我添加“!”到可选参数。据我了解,这是不正确的,因为这些参数可以为零。有没有好的方法来处理这个问题?谢谢!!!

class Address : BaseEntity {

var Id: Int
var AddressType: Int
var AddressStatus: Int
var Address1: String
var Address2: String
var City: String
var State: String
var Zip: String
var Country: String
var Latitude: Double
var Longitude: Double

init(id: Int, addressType: Int, addressStatus: Int, address1: String = "", address2: String = "", city: String = "", state: String = "", zip: String = "", country: String = "", latitude: Double = 0, longitude: Double = 0, isDeleted: Bool, created: Date? = nil, createdBy: Int = 0, modified: Date? = nil, modifiedBy: Int = 0) {
self.Id = id
self.AddressType = addressType
self.AddressStatus = addressStatus
self.Address1 = address1
self.Address2 = address2
self.City = city
self.State = state
self.Zip = zip
self.Country = country
self.Latitude = latitude
self.Longitude = longitude
super.init(isDeleted: isDeleted, created: created, createdBy: createdBy, modified: modified, modifiedBy: modifiedBy)
}

convenience init?(json: [String: Any]) {

guard let id = json["Id"] as? Int,
let addressType = json["AddressType"] as? Int,
let addressStatus = json["AddressStatus"] as? Int,
let isDeleted = json["IsDeleted"] as? Bool
else {
return nil
}

let address1 = json["Address1"] as? String
let address2 = json["Address2"] as? String
let city = json["City"] as? String
let state = json["State"] as? String
let zip = json["Zip"] as? String
let country = json["Country"] as? String
let latitude = json["Latitude"] as? Double
let longitude = json["Longitude"] as? Double

let date = Foundation.Date()
let created = date.dateFromJson(json: json["Created"] as? String)
let createdBy = json["CreatedBy"] as? Int
let modified = date.dateFromJson(json: json["Modified"] as? String)
let modifiedBy = json["ModifiedBy"] as? Int

self.init(id: id, addressType: addressType, addressStatus: addressStatus, address1: address1!, address2: address2!, city: city!, state: state!, zip: zip!, country: country!, latitude: latitude!, longitude: longitude!, isDeleted: isDeleted, created: created, createdBy: createdBy!, modified: modified, modifiedBy: modifiedBy!)
}
}

最佳答案

除了我对命名约定的评论外,没有必要使您的属性可变。你应该看看“??”零合并运算符:

class Address {
let id: Int
let addressType: Int
let addressStatus: Int
let address1: String
let address2: String
let city: String
let state: String
let zip: String
let country: String
let latitude: Double?
let longitude: Double?

init(id: Int, addressType: Int, addressStatus: Int, address1: String = "", address2: String = "", city: String = "", state: String = "", zip: String = "", country: String = "", latitude: Double? = nil, longitude: Double? = nil) {
self.id = id
self.addressType = addressStatus
self.addressStatus = addressStatus
self.address1 = address1
self.address2 = address2
self.city = city
self.state = state
self.zip = zip
self.country = country
self.latitude = latitude
self.longitude = longitude
}
init?(json: [String: Any]) {
guard
let id = json["Id"] as? Int,
let addressType = json["AddressType"] as? Int,
let addressStatus = json["AddressStatus"] as? Int,
let isDeleted = json["IsDeleted"] as? Bool
else {
return nil
}
self.id = id
self.addressType = addressType
self.addressStatus = addressStatus
self.address1 = json["Address1"] as? String ?? ""
self.address2 = json["Address2"] as? String ?? ""
self.city = json["City"] as? String ?? ""
self.state = json["State"] as? String ?? ""
self.zip = json["Zip"] as? String ?? ""
self.country = json["Country"] as? String ?? ""
self.latitude = json["Latitude"] as? Double
self.longitude = json["Longitude"] as? Double

print(isDeleted)
// call super.init here
}
}

let address1 = Address(id: 1, addressType: 2, addressStatus: 3)
let address2 = Address(id: 2, addressType: 3, addressStatus: 4, address1: "Any Address", latitude: 22.0, longitude: 43.0) // You don't need to add all parameters as long as you keep them in the same order as your initializer
print(address1.id) // 1
print(address1.address1) // "" empty String
print(address2.latitude ?? "nil") // 22.0
print(address2.longitude ?? "nil") // 43.0

关于接受带有可选参数的 JSON 的 Swift 3 init 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41879186/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com