swift - 如何在结构中解开快速选项
问题描述
我正在快速学习并找到一个在结构中包含可选属性的示例。当我尝试为可选设置一个值时,我发现它是 nil。
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) 我收到错误“可选类型‘价格’的值?必须解包以引用已包装基本类型“价格”的成员“美元”
如何打开价格以设置美元值?
解决方案
Optional
如果您没有为自身分配值,则不能直接设置 an 的属性Optional
,因为由于可选链接,usd
不会调用 setter 。
相反,您需要分配一个Price
to purchase.price
。
var purchase:Item = Item()
purchase.name = "lampshade"
purchase.price = Price(USD: 19.2)
或者,如果你想分配一个 "empty" price
,那么可选的链接就可以了,因为 nowprice
不是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)
推荐阅读
- javascript - 在正则表达式中查找唯一值的问题
- oracle - 如何在 ORACLE 中对 DATE FORMAT 进行约束
- javascript - 是否可以将所有浏览器控制台消息/错误通过管道传输到远程机器?
- java - 为什么没有从这个 Java 流中过滤出空字符串?
- javascript - 如何存储和检索从 Firebase 到应用程序的 URL
- typescript - 如何使用 Object.fromEntries 将 js Map 转换为 typescript 中的对象
- jenkins - Jenkins Blue Ocean 在参数化构建中使用凭证
- snowflake-cloud-data-platform - Snowpipe 中的特殊字符,如 ñ 和 ß
- javascript - 在 Chrome 中为图像使用“预取”链接
- sql - Django多对多:在一个相关查询集中获取元素但排除其他相关查询集中元素的最佳方法?