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.)
这里发生了什么?
在运行时,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)而前者自动解包(如果使用不当可能会导致崩溃).