swift 3中的可选值优化方式

时间:2017-08-06 04:54:58

标签: swift swift3 model optional

我创建了类测试模型,其中有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”

2 个答案:

答案 0 :(得分:1)

priceDouble类型,您要求的是将该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
    }
}

但我仍然建议你改用??