Swift嵌套的非可选结构给出了可选的

时间:2016-12-12 14:41:39

标签: 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
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。)

这里发生了什么?

2 个答案:

答案 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支持。

Proposal for abolishing IUO

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