我制作了一个简单的结构来处理UI背景的管理(用户可以选择使用渐变或图像)。在这个结构体内部是一个名为preference
的计算属性,它获取并设置用户对UserDefaults的偏好。
当我尝试使用以下代码设置 preference
属性时:
Background().preference = .gradient
我收到错误:"无法分配属性:函数调用返回不可变值"
我必须改用它:
var background = Background()
background.preference = .gradient
我希望在最终设置属性之前不必将Background
的实例分配给变量。
我发现将Background
从struct
更改为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")
}
}
}
答案 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
我知道这不能回答你的确切问题,但我认为如果你四处寻找,你会发现有更好的解决方案。