设置计算值(struct vs class)

时间:2017-02-09 11:23:28

标签: ios swift

我制作了一个简单的结构来处理UI背景的管理(用户可以选择使用渐变或图像)。在这个结构体内部是一个名为preference的计算属性,它获取并设置用户对UserDefaults的偏好。

当我尝试使用以下代码设置 preference属性时:

Background().preference = .gradient

我收到错误:"无法分配属性:函数调用返回不可变值"

我必须改用它:

var background = Background() background.preference = .gradient

我希望在最终设置属性之前不必将Background的实例分配给变量。

我发现将Backgroundstruct更改为class可让我直接使用Background().preference = .gradient设置属性。

任何人都可以告诉我为什么会这样吗?在这种情况下使用class比使用struct更好还是没关系?

struct Background {

enum Choice {
    case gradient
    case image
}

var preference: Choice {

    get {
        if let type = UserDefaults.standard.value(forKey: "background_type"), type as! String == "background" {
           return .image
        }
        return .gradient
    }

    set(value){
        if value == .image {
            UserDefaults.standard.setValue("background", forKey: "background_type")
        }else{
            UserDefaults.standard.setValue("gradient", forKey: "background_type")
        }
    }
}

1 个答案:

答案 0 :(得分:1)

你真的没有从使struct / class的实例包装UserDefaults中获得任何价值。这是一个非常普遍的问题,如果你搜索一下,谷歌有很多聪明的解决方案。对于一个非常简单的示例,您可以扩展UserDefaults

//: Playground - noun: a place where people can play

import Cocoa


enum BackgroundChoice {
    case gradient
    case image
}

extension UserDefaults {

    var backgroundChoice: BackgroundChoice {
        get {
            if let type = string(forKey: "background_type"), type == "image" {
                return .image
            }
            return .gradient
        }

        set(value){
            if value == .image {
                setValue("background", forKey: "background_type")
            }else{
                setValue("gradient", forKey: "background_type")
            }
        }
    }

}

UserDefaults.standard.backgroundChoice = .image

我知道这不能回答你的确切问题,但我认为如果你四处寻找,你会发现有更好的解决方案。