как развернуть быстрые опции в структуре - PullRequest
0 голосов
/ 28 мая 2020

Я быстро учусь и нашел пример, который содержит необязательное свойство в структуре. Когда я пытаюсь установить значение optional, я обнаруживаю, что оно равно нулю.

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), я получаю сообщение об ошибке «Значение необязательного типа« Цена? » должен быть развернут, чтобы ссылаться на элемент «USD» обернутого базового типа «Price»

Как развернуть цену, чтобы установить значение USD?

1 Ответ

3 голосов
/ 28 мая 2020

Вы не можете напрямую установить свойство Optional, если вы не присвоили значение самому Optional, поскольку из-за необязательной цепочки установщик usd не будет вызываться.

Вместо этого вам нужно присвоить Price purchase.price.

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

Или, если вы хотите назначить «пустой» price, то необязательная цепочка для этого работает, так как теперь price не nil.

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

Кроме того, вы должны попытаться сделать свойства неизменяемыми неизменяемыми (let) по умолчанию и делать свойства изменяемыми (var) только если они действительно нужны изменить после инициализации. Вы также должны добавлять значения по умолчанию к свойствам только там, где для них имеет смысл иметь значение по умолчанию. Например, name не должен иметь его, а должен быть неизменным, а его значение устанавливается в init.

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


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