[Swift] ๋์ ๋๋ฆฌ๋ฅผ ๊ฐ์ฒด๋ก , ๊ฐ์ฒด๋ฅผ ๋์ ๋๋ฆฌ๋ก ๋ฐ๊พธ๋ ๋ฒ (Dictionary to object , Object to dictionary)
์๋ ํ์ธ์ Foma ์ ๋๋ค!
์์ฆ ๊ฐ๋ฐํ๊ณ ์๋ ํ๋ก์ ํธ๋ Restful API ๋ฐฉ์์ผ๋ก ํต์ ํ๋๋ฐ์.
์ด ๋ json ํ์์ผ๋ก ๋ฐ๋ ๋ฐ์ดํฐ (get) ๋ฅผ Alamofire์ SwiftyJSON ์ด๋ผ๋ ์ข์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ์ฝ๊ฒ ๋์ ๋๋ฆฌ ํํ๋ก ๋ฐ๊ฟ ์ ์์์ต๋๋ค.
ํ์ง๋ง ์ด๋ ๊ฒ ๋ฐ๋ ๋์ ๋๋ฆฌ๋ฅผ ์ํ๋ Object ํํ๋ก ๋ฐ๊ฟ์ ์ ์ฅํ๋ฉด ๋ ํจ์จ์ ์ธ ์ฝ๋๋ฅผ ์ธ ์ ์๋ค๊ณ ์๊ฐํ์ต๋๋ค.
๋ํ ์๋ฒ์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ ๋ (post,put ๋ฑ) ๋ ์ด๋ ๊ฒ ๊ฐ์ฒด๋ก ๋์ด์๋ ๋ฐ์ดํฐ๋ฅผ ๋์ ๋๋ฆฌ ํํ๋ก ๋ฐ๊ฟ์ ์ ๋ฌํด์ผ ํ์ต๋๋ค.
๊ทธ๋์ ๊ฒฐ๊ตญ ๊ฐ๋จํ๊ฒ ๋ฐ๊ฟ ์ ์๋ ๋ฐฉ๋ฒ์ ์ฐพ์์ ์ ๋ฆฌํด๋ณด๋ ค๊ณ ํฉ๋๋ค.
Object๋ฅผ Dictionary๋ก ๋ฐ๊พธ๊ธฐ
๋จผ์ ์ด๋ฆ๊ณผ ๋์ด์ ์ฑ๋ณ์ ๊ฐ์ง๊ณ ์๋ User๋ผ๋ ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด ์ฃผ์ธ์. (์ํ์๋ ๊ฐ์ฒด๋ก ๋ง๋์ ๋ ๋ฌด๋ฐฉํฉ๋๋ค.)
์ฃผ์ํ์ค ์ ์ ์ด ๊ฐ์ฒด๋ ๋์ฝ๋ฉ,์ธ์ฝ๋ฉ ๋์ด์ผ ํ๊ธฐ ๋๋ฌธ์ ๋ฐ๋์ Codable ํ๋กํ ์ฝ์ ์ฑํํ์ ์ผ ํฉ๋๋ค.
struct User:Codable {
let name:String
let age:Int
let gender:Bool
init(name:String,age:Int,gender:Bool) {
self.name = name
self.age = age
self.gender = gender
}
}
Encodable์ ํ์ฅ์ ํด์ ์๋์ ๊ฐ์ด ๋ถ์ฌ๋ฃ์ด์ฃผ์ธ์.
๊ฐ์ฒด๋ฅผ ์ธ์ฝ๋ฉํ์ฌ ๋์ ๋๋ฆฌ๋ก ๋ฐ๊พธ๋ ๊ณผ์ ์ ๋๋ค.
extension Encodable {
var toDictionary : [String: Any]? {
guard let object = try? JSONEncoder().encode(self) else { return nil }
guard let dictionary = try? JSONSerialization.jsonObject(with: object, options: []) as? [String:Any] else { return nil }
return dictionary
}
}
์ด๊ฒ์ user ์ธ์คํด์ค์ ์ ์ฉํด์ฃผ์๋ฉด ์๋์ ๊ฐ์ด ๋์ ๋๋ฆฌ ํํ๋ก ๋ฐํ๋์ด ์ถ๋ ฅ๋๋ ๊ฑธ ๋ณผ ์ ์์ต๋๋ค.
let user = User(name: "foma", age: 26, gender: true)
print(user.toDictionary) //Optional(["name": foma, "gender": 1, "age": 26])
Dictionary๋ฅผ Object๋ก ๋ฐ๊พธ๊ธฐ
๋จผ์ ์ฌ๋ฌ ์ ์ ๋ฅผ ๋ง๋ ๋ค์ ์ ์ ๋ค์ ๋์ ๋๋ฆฌ ํํ๋ก ๋ฐ๊ฟ์ ๋ฐฐ์ด ์์ ๋ด์์ค๋๋ค.
let user1 = User(name: "foma", age: 26, gender: true)
let user2 = User(name: "gram", age: 26, gender: true)
let user3 = User(name: "asdf", age: 26, gender: true)
let usersDictionary = [user1.toDictionary!,user2.toDictionary!,user3.toDictionary!]
๊ทธ ๋ค์์ผ๋ก ์ด์ ๋์ ๋๋ฆฌ๋ฅผ User ๊ฐ์ฒด๋ก ๋ณํ ์์ผ์ค์ผ๊ฒ ์ฃ ?
์๋๋ ํ๋ผ๋ฏธํฐ๋ก ์ํ๋ ๊ฐ์ฒด ํ์ ๊ณผ ๋์ ๋๋ฆฌ๋ฅผ ๋ฐ๊ณ ์ํ๋ ๊ฐ์ฒด๋ฅผ ๋ด์ ๋ฐฐ์ด๋ก ๋ฐํํด์ฃผ๋ ํจ์์ ๋๋ค.
๋์ ๋๋ฆฌ๋ฅผ ๋์ฝ๋ฉํ ํ ๊ฐ์ฒด๋ก ๋ณํ์์ผ ๋ฐํํด์ฃผ๋ ๊ณผ์ ์ ๋๋ค.
func dictionaryToObject<T:Decodable>(objectType:T.Type,dictionary:[[String:Any]]) -> [T]? {
guard let dictionaries = try? JSONSerialization.data(withJSONObject: dictionary) else { return nil }
let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
guard let objects = try? decoder.decode([T].self, from: dictionaries) else { return nil }
return objects
}
์๋์ ๊ฐ์ด dictionaryToOjbectํจ์์ objectType์ผ๋ก User.self ๋ฅผ dictionary์ ์์์ ๋ง๋ค์ด์ค usersDictionary๋ฅผ ๋ฃ์ด์ค๋๋ค.
let objects = dictionaryToObject(objectType: User.self , dictionary: usersDictionary)
๊ทธ๋ฆฌ๊ณค objects ์์ ์ถ๋ ฅํด๋ณด๋ฉด ์๋์ ๊ฐ์ด User๊ฐ์ฒด๋ก ์ถ๋ ฅ๋๋ ๋ชจ์ต์ ๋ณผ ์ ์์ต๋๋ค!!
for object in objects! {
print(object)
}
์ค๋์ ์ด๋ ๊ฒ ๋์ ๋๋ฆฌ๋ฅผ ๊ฐ์ฒด๋ก ๋ ๊ฐ์ฒด๋ฅผ ๋์ ๋๋ฆฌ๋ก ๋ฐ๊พธ๋ ๋ฐฉ๋ฒ์ ๋ํด์ ์์๋ณด์๋๋ฐ์.
ํน์๋ผ๋ ๋ ๋์ ๋ฐฉ๋ฒ์ด ์๊ฑฐ๋ ํ๋ฆฐ ๋ถ๋ถ์ด ์๋ค๋ฉด ์ธ์ ๋ ๋๊ธ ๋ฌ์์ฃผ์ธ์!