Return getter 中的非可选值,而 setter 中允许可选值
Return non optional value in getter, while allowing optional value in setter
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
...
你可以这样做:
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
) 设为可选,这样您的 public 属性 就不会了。使用 nil 合并运算符 (??
) 来确定 return.
class MyClass {
private var _image: UIImage?
var image: UIImage {
set { _image = newValue }
get { return _image ?? UIImage(named: "some_image")! }
}
}
听起来你想使用一个隐式解包的可选。由于您的 getter 只是一个非可选 UIImage 的包装器,您知道您的 getter 将始终产生一个非 nil 值(并且由于 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
被分配给您的默认图像。
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
...
你可以这样做:
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
) 设为可选,这样您的 public 属性 就不会了。使用 nil 合并运算符 (??
) 来确定 return.
class MyClass {
private var _image: UIImage?
var image: UIImage {
set { _image = newValue }
get { return _image ?? UIImage(named: "some_image")! }
}
}
听起来你想使用一个隐式解包的可选。由于您的 getter 只是一个非可选 UIImage 的包装器,您知道您的 getter 将始终产生一个非 nil 值(并且由于 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
被分配给您的默认图像。