我有以下代码:
struct Product {
var image: URL!
var title: String!
var price: Price!
var rating: Float!
var url: URL!
}
struct Price {
var value: Double!
var currency: String! // should be enum
}
我稍后使用:
初始化Product
product = Product(
image: URL(string: "...")!,
title: "...",
price: Price(
value: 5.99,
currency: "CAD"
),
rating: 4.5,
url: URL(string: "...")!
)
在运行时,product.price
的类型为Price?
我发现这很奇怪,因为它是隐式展开的。
我尝试过Price
init()
方法,结果相同。我也尝试在var price: Price! = Price(value: 0, currency: "CAD")
定义中使用Product
,结果相同。 (我将成员初始化程序添加到Price
。)
这里发生了什么?
答案 0 :(得分:5)
在运行时,product.price的类型是Price吗?我觉得这很奇怪,因为它明确地设置为非可选的
不,您明确将其设置为可选:
struct Product {
var image: URL! // <-- Explicitly marked as optional via '!'
}
如果您希望它是非可选的,请不要通过!
或?
将其标记为可选:
struct Product {
var image: URL // <-- not marked as optional
}
!
和?
都是选项。唯一的区别是后者需要明确解包(if let
),而前者自动解包(如果使用不当可能会导致崩溃)。
答案 1 :(得分:1)
也许是因为在Swift 3中,隐式解包的选项由普通的Optional
支持。
但是,外观!在属性或变量声明类型的末尾不再表示声明具有IUO类型;相反,它表示(1)声明具有可选类型,(2)声明具有一个属性,指示可以隐式强制其值。 (没有人会写或观察这个属性,但我们会将其称为@_autounwrapped。)此类声明此后称为IUO声明。