在init中计算let struct属性的值

时间:2015-09-15 05:37:54

标签: swift swift2

我有一个名为Product的swift结构,它在init方法中使用Dictionary。我想在我的产品中的本地Price结构中计算价格value。我希望这个值为let常量,因为它不会发生变化,但是很快就不允许我在不使用var的情况下执行此操作,并说明let } constant未正确初始化。

在这种情况下,如何让我的Price结构中的value属性变为常量?

struct Product {
    let price: Price

    init(dictionary: Dictionary<String, AnyObject>) {
        if let tmp = dictionary["price"] as? Dictionary<String, AnyObject> { price = Price(dictionary: tmp) } else { price = Price() }
    }

    struct Price {
        var value = ""

        init() {
        }

        init(dictionary: Dictionary<String, AnyObject>) {
            if let xForY = dictionary["xForY"] as? Array<Int> {
                if xForY.count == 2 {
                    value = "\(xForY[0]) for \(xForY[1])"
                }
            }
            if let xForPrice = dictionary["xForPrice"] as? Array<Int> {
                if value == "" && xForPrice.count == 2 {
                    value = "\(xForPrice[0]) / \(xForPrice[1]):-"
                }
            }
            if let reduced = dictionary["reduced"] as? String {
                if value == "" {
                    value = "\(reduced):-"
                }
            }
        }
    }
}

2 个答案:

答案 0 :(得分:2)

您必须重写代码,以便编译器获得您打算实际执行的操作。从你编码的方式推断它是不够聪明的。

我还建议您为AtomicReference结构构建初始化程序,而不是为Price属性使用空字符串。作为该更改的结果,value结构的price属性变为可选。

Product

答案 1 :(得分:1)

问题在于:(1)您在声明中分配给value,(2)您没有在init()中分配值,以及(3)您正在引用和在value中重新分配init([String: AnyObject])。您只能将一个值赋值给一个常量,并且只能在赋值后引用它的值。

要解决此问题,您可以公开只读公告:

private(set) var value: String = ""

或者您可以在init中使用第二个变量:

struct Price {
    let value: String

    init() {
        self.value = ""
    }

    init(dictionary: Dictionary<String, AnyObject>) {
        var v: String = ""
        if let xForY = dictionary["xForY"] as? Array<Int> {
            if xForY.count == 2 {
                v = "\(xForY[0]) for \(xForY[1])"
            }
        }
        if let xForPrice = dictionary["xForPrice"] as? Array<Int> {
            if v == "" && xForPrice.count == 2 {
                v = "\(xForPrice[0]) / \(xForPrice[1]):-"
            }
        }
        if let reduced = dictionary["reduced"] as? String {
            if v == "" {
                v = "\(reduced):-"
            }
        }
        self.value = v
    }
}