2017-09-21 75 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

相關問題