Swift嵌套非可选结构提供可选

Swift嵌套非可选结构提供可选,swift,struct,optional,Swift,Struct,Optional,我有以下代码: 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 = Prod

我有以下代码:

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(
    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!=价格(值:0,货币:“CAD”)
产品
定义中,具有相同的结果。(我在
Price
中添加了成员初始值设定项)


这是怎么回事?

可能是因为在Swift 3中,隐式展开的期权由普通的
可选的
支持

:

但是,外观!在属性或变量的末尾,声明的类型不再表示该声明具有IUO类型;相反,它表示(1)声明具有可选类型,(2)声明具有一个属性,指示其值可能是隐式强制的。(没有人会书写或观察这个属性,但我们将其称为@(u autounwrapped))这样的声明从此被称为IUO声明


可能是因为在Swift 3中,隐式展开的选项由普通的
可选的
支持

:

但是,外观!在属性或变量的末尾,声明的类型不再表示该声明具有IUO类型;相反,它表示(1)声明具有可选类型,(2)声明具有一个属性,指示其值可能是隐式强制的。(没有人会书写或观察这个属性,但我们将其称为@(u autounwrapped))这样的声明从此被称为IUO声明

在运行时,product.price的类型为price?我觉得这很奇怪,因为它被显式设置为非可选

否,您明确地将其设置为“可选”:

struct Product {
  var image: URL! // <-- Explicitly marked as optional via '!'
}
都是
是可选的。唯一的区别是后者需要显式展开(
如果let
),而前者则自动展开(如果使用不当,可能导致崩溃)

在运行时,product.price的类型为price?我觉得这很奇怪,因为它被显式设置为非可选

否,您明确地将其设置为“可选”:

struct Product {
  var image: URL! // <-- Explicitly marked as optional via '!'
}

都是
是可选的。唯一的区别是后者需要显式展开(
如果let
),而前者则自动展开(如果使用不当,可能导致崩溃)。

为什么结构属性首先隐式展开选项?这还不清楚。既然您正在解包这些值,您应该只使用非可选属性并使用memberwise初始值设定项。您是如何检查“
product.price
属于
price?
”类型的?请注意,隐式包装在Swift 3中不再是一种独特的类型。请参阅例如或。我正在使用非可选属性,它修复了我遇到的问题。但它没有抛出任何错误,这仍然很奇怪,对吗?我使用调试器进行了检查。(
print product.price
)对于每一个不合理的隐式展开可选、强制施放或强制强迫,一只可爱的小猫在世界的某个地方哭。@DanielQue这是隐式展开可选,这是可选的。为什么结构属性首先隐式展开可选?这还不清楚。既然您正在解包这些值,您应该只使用非可选属性并使用memberwise初始值设定项。您是如何检查“
product.price
属于
price?
”类型的?请注意,隐式包装在Swift 3中不再是一种独特的类型。请参阅例如或。我正在使用非可选属性,它修复了我遇到的问题。但它没有抛出任何错误,这仍然很奇怪,对吗?我使用调试器进行了检查。(
print product.price
)对于每一个不合理的隐式解包可选、强制施放或强制强迫,一只可爱的小猫在世界的某个地方哭泣。@DanielQue这是一个隐式解包可选,这是可选的。