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

时间:2015-06-05 02:07:08

标签: swift setter getter optional

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

3 个答案:

答案 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")! }
    }
}