我创建了类测试模型,其中有4个dataMember,访问时不应为null(表示返回默认值)
extension Double {
/// Rounds the double to decimal places value
func roundTo(places:Int = 2) -> Double
{
let divisor = pow(10.00, Double(places))
return (self * divisor).rounded() / divisor
}
}
class TestingModel{
var id : String!
var name : String! = "abc" /*It is not working*/
var price : Double! = 0.00
var uniqueId : Int! = 1
/**
* Instantiate the instance using the passed dictionary values to set the properties values
*/
init(dictionary: [String:Any])
{
id = (dictionary["id"] as? String) ?? "" //I dont want to do like this way
name = dictionary["name"] as? String
price = (dictionary["price"] as? Double)?.roundTo() ?? 0.00
uniqueId = dictionary["unique_id"] as? Int
}
}
let t:TestingModel = TestingModel.init(dictionary: ["x id" : "x012y12345z45","x name":"test1","x price":100.0,"uniqueId":1236.0])
let testString = "Jd " + t.id
print(testString) //Perfect
print(t.name)
print(t.price) /* Only one decemal point is printed */
获取输出
Jd
nil
0.0
预期输出
JD
abc / 应该返回abc而不是nil /
0.00 / 两个小数点complulsury /
我在
中的意思如果我将nil值赋给变量,那么它应该保留其默认值而不编写此可选链 ??构造函数中的“abc”
答案 0 :(得分:1)
price
是Double
类型,您要求的是将该double值打印到2位小数。然后你应该使用以下内容。
let a = 0.0
print(String(format: "%.2f", a))
打印:
0.00
如果您打算将其四舍五入到小数位,那么上面的代码也将返回该值。但是如果你需要它来舍入并返回一个double类型,那么你可以检查this answer
根据您更新的问题,我建议使用以下模型:
class TestingModel{
var id : String = ""
var name : String = "abc"
var price : Double = 0.0
var uniqueId : Int = 1
/**
* Instantiate the instance using the passed dictionary values to set the properties values
*/
init(dictionary: [String:Any])
{
id = (dictionary["id"] as? String) ?? ""
name = dictionary["name"] as? String ?? "abc"
price = (dictionary["price"] as? Double) ?? 0.0
uniqueId = dictionary["unique_id"] as? Int ?? 1
}
}
答案 1 :(得分:0)
您似乎在这里提出了两个不同的问题。关于双打的第一个问题已由adev回答。我将回答第二个问题,即:
如果我将nil值赋给变量那么它应该保留其默认值而不写这个可选链接? " ABC"在构造函数
中
如果你想这样做,那就意味着变量根本不应该是可选的,因为nil
不是其有效值之一。使变量成为非可选类型并为其指定默认值。
class TestingModel{
var id : String = ""
var name : String = "abc"
var price : Double = 0.00
var uniqueId : Int = 1
}
由于字典的性质,您无法在构造函数中使用??
。如果密钥不存在,它们将始终返回nil
值。你必须检查它。即使这是可能的,它也没有意义。想象一下这样的事情:
someVariable = nil // someVariable is now 0
这非常令人困惑。 someVariable
为0,即使nil
似乎已分配给它。
解决方法是添加字典扩展名。像这样:
extension Dictionary {
func value(forKey key: Key, defaultValue: Value) -> Value {
return self[key] ?? defaultValue
}
}
但我仍然建议你改用??
。