我有一个名为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):-"
}
}
}
}
}
答案 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
}
}