Swift将需要testA的显式声明变量,因此您将无法100%动态。但是,由于您需要在代码中使用该变量,因此会在某个时刻知道该变量。鉴于此,本着最小化声明约束的精神,您可以定义一个使用字典作为内部存储的类,并将键值公开为计算属性。
这里有一个例子:
class DictionaryBased
{
var content:[String:Any]
init(_ dictionary:[String:Any])
{ content = dictionary }
func get<T>(_ key:String, _ defaultValue:T) -> T
{ return content[key] as? T ?? defaultValue }
func set<T>(_ key:String, _ value:T)
{ content[key] = value }
}
class SimpleHash:DictionaryBased
{}
有了这个,你可以根据需要(并根据需要)使用扩展添加计算性能。
extension SimpleHash
{
var testA:String { get { return get("testA", "") } set { set("testA",newValue) } }
var testB:String { get { return get("testB", "") } set { set("testB",newValue) } }
// if variables are "read-only", you don't need the set { } part
var testC:String { get { return get("testC", "") } }
}
您可以添加已输入或未输入的变量,并支持optionals或(如上所述)提供默认值。
extension SimpleHash
{
var testD:Any? { get { return get("testD", nil) } set { set("testD",newValue) } }
var testE:String? { get { return get("testE", nil) } set { set("testE",newValue) } }
var testF:Date? { get { return get("testF", nil) } set { set("testE",newValue) } }
}
要使用这种“基于字典”的对象,你需要在某个时候创建一个实例,并给它的字典的内容:
let simpleHash = SimpleHash(["testA": "A", "testB": "B", "testC": "C"])
simpleHash.testA // "A"
simpleHash.testD // nil
需要注意的是,这不会是与使用本地属性并将字典映射到每个物理变量一样高效。另一方面,它的代码少得多。如果变量不经常被引用,那么额外的开销可能是一个可接受的权衡,因为简单性和灵活性。
你在说些什么物品呢?你的字典和JSON有什么关系? –
@ElTomato我清楚地提到了我想要的字典'simpleHash' – Raja
看看JSONDecoder。 – rmaddy