2017-09-21 48 views
-4

[我是新来的斯威夫特,我不知道这是可能的或没有,所以请给我建议]在Swift 3中,如何将字典转换为Object?

我有一本字典(这是动态的)这样的:

let simpleHash = ["testA": "A", "testB": "B", "testC": "C"] 

我想将其转换为一个对象,这样我就可以访问诸如:

simpleHash.testA // instead of simpleHash["testA"] 

我曾尝试下面的一个,但它并没有帮助

let jsonData = try JSONSerialization.data(withJSONObject: simpleHash, options: .prettyPrinted) 
let decoded = try JSONSerialization.jsonObject(with: jsonData, options: []) 

任何人都可以请在这个建议我。 在此先感谢!

+0

你在说些什么物品呢?你的字典和JSON有什么关系? –

+0

@ElTomato我清楚地提到了我想要的字典'simpleHash' – Raja

+0

看看JSONDecoder。 – rmaddy

回答

0

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 

需要注意的是,这不会是与使用本地属性并将字典映射到每个物理变量一样高效。另一方面,它的代码少得多。如果变量不经常被引用,那么额外的开销可能是一个可接受的权衡,因为简单性和灵活性。

0

简单struct握住你的Dictionary值:

struct SimpleStruct { 
    // properties are Optional since they might not be matched 
    let testA: String? 
    let testB: String? 

    // this one has a default value 
    let testC: String 

    // init that takes a Dictionary 
    init(dictionary: [String:Any]) { 
    // set the Optional ones 
    self.testA = dictionary["testA"] as? String 
    self.testB = dictionary["testB"] as? String 

    // set the one with a default 
    self.testC = dictionary["testC"] as? String ?? "C" 
    } 
} 

let foo = SimpleStruct(dictionary: ["testA": "A", "testB": "B", "testC": "C"]) 

// force-unwrapping for brevity 
// you should actually test before using 
print(foo.testA!) // prints A 
print(foo.testB!) // prints B 
print(foo.testC) // prints C 
+1

更好地使初始化程序failable,比使所有属性可选 – Alexander

+0

@Alexander True,failable初始值设定项也将工作。我没有让这一个failable,因为我包括其中之一的默认值。 – ColGraff

相关问题