class MyClass {
private var _image: UIImage
var image: UIImage {
set {
if newValue == nil {
_image = UIImage(named: "some_image")!
}
}
get {
return _image
}
}
}
我的目标是在访问image
时保证非可选值
我可以在没有额外功能的情
即使我使用didSet
/ willSet
他们仍然绑定到UIImage
类型,我无法检查nil
...
听起来你想使用一个隐式解包的可选项。由于你的getter只是一个非可选UIImage的包装器,你知道你的getter总是产生一个非零值(并且由于image
被隐式解包,它将被视为这样),但这也将允许你的setter接受nil值。也许是这样的。
class MyClass {
private var _image: UIImage // ...
var image: UIImage! {
get {
return _image
}
set {
if let newValue = newValue {
_image = newValue
} else {
_image = UIImage(named: "some_image")!
}
}
}
}
哪里
image = nil
将_image
指定为您的默认值,并且
image = UIImage(named: "something_that_exists")!
将新图像分配给_image
。请注意,这也允许您从UIImage(named:)
分配变量而不强行解开可选项。如果UIImage的初始化程序失败,因为它无法找到图像,它将评估为nil并仍然会导致_image
被分配您的默认图像。
你可以这样做:
private var image: UIImage = UIImage(named: "some_image")!
因此,使用默认图像初始化图像,如果未设置为另一个图像,则将使用此图像。
private var _image: UIImage?
var image: UIImage? {
set {
if _image == nil {
_image = newValue
}
}
get {
return _image
}
}
您可以使您的支持变量(_image
)可选,因此您的公共财产不会。使用nil合并运算符(??
)确定要返回的运算符。
class MyClass {
private var _image: UIImage?
var image: UIImage {
set { _image = newValue }
get { return _image ?? UIImage(named: "some_image")! }
}
}