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
...
答案 0 :(得分:6)
听起来你想使用一个隐式解包的可选项。由于你的getter只是一个非可选UIImage的包装器,你知道你的getter将始终产生一个非零值(并且由于image
被隐式解包,它将被视为这样),但这也将允许你setter接受零值。也许是这样的。
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
分配默认图像。
答案 1 :(得分:0)
你可以这样做:
private var image: UIImage = UIImage(named: "some_image")!
因此,使用默认图像初始化图像,如果未设置为其他图像,则将使用此图像。
private var _image: UIImage?
var image: UIImage? {
set {
if _image == nil {
_image = newValue
}
}
get {
return _image
}
}
答案 2 :(得分:0)
您可以选择支持变量(_image
),这样您的公共财产就不会成功。使用nil合并运算符(??
)来确定要返回的内容。
class MyClass {
private var _image: UIImage?
var image: UIImage {
set { _image = newValue }
get { return _image ?? UIImage(named: "some_image")! }
}
}