问题描述
我有一个内部字典,不想公开给用户。相反,我仅使用属性公开某些值,例如:
public var artist: String? {
get {
return items["artist"]
}
set {
items["artist"] = newValue
}
}
//...so on for another 20 or so items
您可以想象,这最终会重复很多次。我当时以为,属性包装器将是解决此问题的好方法-但是,不可能将items
直接传递给包装器,因为属性包装器是在init
之前创建的(所以{{1} }将无法访问。)
有没有解决的办法,或者这仅仅是propertyWrappers的局限性之一?
解决方法
您可以构建通用解决方案。我做了一个,但是您可能可以改进它:
class PropertyWrapper {
private var items: [String: Any] = ["artist": "some dude"]
enum Key: String {
case artist
}
func getItem<T: Any>(key: Key) -> T {
guard let item = items[key.rawValue] as? T else {
preconditionFailure("wrong type asked for")
}
return item
}
func setItem(value: Any,key: Key) {
items[key.rawValue] = value
}
}
class GetValueClass {
func getValue() {
let wrapper = PropertyWrapper()
let value: String = wrapper.getItem(key: .artist)
}
}
class SetValueClass {
func setValue() {
let wrapper = PropertyWrapper()
wrapper.setItem(value: "some",key: .artist)
}
}