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 被分配给您的默认图像。