在getter中返回非可选值,同时在setter中允许可选值

问题描述 投票:6回答:3
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 ...

swift setter getter optional
3个回答
6
投票

听起来你想使用一个隐式解包的可选项。由于你的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被分配您的默认图像。


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
    }
}

0
投票

您可以使您的支持变量(_image)可选,因此您的公共财产不会。使用nil合并运算符(??)确定要返回的运算符。

class MyClass {
    private var _image: UIImage?

    var image: UIImage {
        set { _image = newValue }
        get { return _image ?? UIImage(named: "some_image")! }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.