0

我有一个不想向用户公开的内部字典。相反,我只使用属性公开某些值,如下所示:

public var artist: String? {
  get {
     return items["artist"]
  }
  set {
     items["artist"] = newValue
  }
}

//...so on for another 20 or so items

可以想象,这最终会重复很多次。我在想属性包装器将是清理它的好方法 - 但是,不可能items直接传递给包装器,因为属性包装器是之前创建的init(因此self无法访问)。

有没有办法解决这个问题,或者这只是 propertyWrappers 的限制之一?

4

1 回答 1

1

您可以构建一个通用解决方案。我做了一个,但你可能可以改进它:

    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)
    }
}
于 2020-08-10T18:45:48.530 回答