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