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这是一个隐式解包可选,这是可选的。