如何在结构中解包 swift 可选值

how to unwrap swift optionals within a struct

我正在学习 swift 并找到了一个在结构中包含可选 属性 的示例。当我尝试为可选设置一个值时,我发现它是零。

struct Price{
    var USD: Double = 0.0
    var CAD: Double = 0.0
}
struct Item{
    var name: String = "not defined"
    var price: Price?
}


var purchase:Item = Item()
purchase.name = "lampshade"
purchase.price?.USD = 19.2


print("purchase name is \(purchase.name), purchase price is \(purchase.price?.USD)")

产量

purchase name is lampshade, purchase price is nil

如果我尝试 (purchase.price.USD) 我收到错误消息“必须解包可选类型 'Price?' 的值以引用包装基类型 'Price' 的成员 'USD'

如何打开价格以设置美元值?

如果您还没有为 Optional 本身赋值,则不能直接设置 Optional 的 属性,因为由于可选链接,setter of usd 不会被调用。

相反,您需要将 Price 分配给 purchase.price

var purchase:Item = Item()
purchase.name = "lampshade"
purchase.price = Price(USD: 19.2)

或者如果你想分配一个 "empty" price,那么可选链就可以了,因为现在 price 不是 nil

var purchase:Item = Item()
purchase.name = "lampshade"
purchase.price = Price()
purchase.price?.USD = 19.2

此外,您应该尝试使属性不可变(let)默认设置为不可变(let),并且只有在初始化后确实需要更改属性时才使属性可变(var)。您还应该只将默认值添加到对具有默认值有意义的属性。例如,name 不应该有一个,而是应该是不可变的,其值在 init.

中设置
struct Item{
    let name: String
    var price: Price?
}


var purchase = Item(name: "lampshade")
purchase.price = Price(USD: 19.2)