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

Dan*_*Que 0 struct optional swift

我有以下代码:

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
}
Run Code Online (Sandbox Code Playgroud)

我后来初始化了一个Product:

product = Product(
    image: URL(string: "...")!,
    title: "...",
    price: Price(
        value: 5.99,
        currency: "CAD"
    ),
    rating: 4.5,
    url: URL(string: "...")!
)
Run Code Online (Sandbox Code Playgroud)

在运行时期间,product.price类型Price?I发现这很奇怪,因为它是隐式解包的.

我试过给出Price一个init()方法,结果相同.我也试过var price: Price! = Price(value: 0, currency: "CAD")Product定义中使用,结果相同.(我添加了一个成员初始化器Price.)

这里发生了什么?

hnh*_*hnh 5

在运行时,product.price的类型是Price吗?我发现这很奇怪,因为它明确地设置为非可选的

不,您明确将其设置为可选:

struct Product {
  var image: URL! // <-- Explicitly marked as optional via '!'
}
Run Code Online (Sandbox Code Playgroud)

如果您希望它是非可选的,请不要通过!或将其标记为可选?:

struct Product {
  var image: URL // <-- not marked as optional
}
Run Code Online (Sandbox Code Playgroud)

这两个!?是选配.唯一的区别是后者需要显式解包(if let)而前者自动解包(如果使用不当可能会导致崩溃).