例えば:
class Test {
var name: String;
var age: Int;
var height: Double;
func convertToDict() -> [String: AnyObject] { ..... }
}
let test = Test();
test.name = "Alex";
test.age = 30;
test.height = 170;
let dict = test.convertToDict();
dictにはコンテンツがあります:
{"name": "Alex", "age": 30, height: 170}
これはSwiftで可能ですか?
そして、おそらく次のようなものを使用して、辞書のようなクラスにアクセスできますか?
test.value(forKey: "name");
またはそのような何か?
ありがとう。
計算プロパティをstruct
に追加するだけで、値を含むDictionary
を返すことができます。 Swiftネイティブ辞書タイプにはvalue(forKey:)
というメソッドがありません。Dictionary
をNSDictionary
にキャストする必要があります。
struct Test {
let name: String
let age: Int
let height: Double
var dictionary: [String: Any] {
return ["name": name,
"age": age,
"height": height]
}
var nsDictionary: NSDictionary {
return dictionary as NSDictionary
}
}
@ColGraffによって投稿されたリンクされた回答で提案されているようにEncodable
プロトコルを拡張して、すべてのEncodable
構造体にユニバーサルにすることもできます。
struct JSON {
static let encoder = JSONEncoder()
}
extension Encodable {
subscript(key: String) -> Any? {
return dictionary[key]
}
var dictionary: [String: Any] {
return (try? JSONSerialization.jsonObject(with: JSON.encoder.encode(self))) as? [String: Any] ?? [:]
}
}
struct Test: Codable {
let name: String
let age: Int
let height: Double
}
let test = Test(name: "Alex", age: 30, height: 170)
test["name"] // Alex
test["age"] // 30
test["height"] // 170
このようなReflectionとMirrorを使用して、より動的にし、プロパティを忘れないようにすることができます。
struct Person {
var name:String
var position:Int
var good : Bool
var car : String
var asDictionary : [String:Any] {
let mirror = Mirror(reflecting: self)
let dict = Dictionary(uniqueKeysWithValues: mirror.children.lazy.map({ (label:String?,value:Any) -> (String,Any)? in
guard label != nil else { return nil }
return (label!,value)
}).compactMap{ $0 })
return dict
}
}
let p1 = Person(name: "Ryan", position: 2, good : true, car:"Ford")
print(p1.asDictionary)
["name": "Ryan"、 "position":2、 "good":true、 "car": "Ford"]