๐Ÿ“Œ Language/Swift

[Swift] ๋”•์…”๋„ˆ๋ฆฌ๋ฅผ ๊ฐ์ฒด๋กœ , ๊ฐ์ฒด๋ฅผ ๋”•์…”๋„ˆ๋ฆฌ๋กœ ๋ฐ”๊พธ๋Š” ๋ฒ• (Dictionary to object , Object to dictionary)

Fomagran ๐Ÿ’ป 2021. 3. 9. 20:09
728x90
๋ฐ˜์‘ํ˜•

์•ˆ๋…•ํ•˜์„ธ์š” 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)
   }
   

 

 

 

์˜ค๋Š˜์€ ์ด๋ ‡๊ฒŒ ๋”•์…”๋„ˆ๋ฆฌ๋ฅผ ๊ฐ์ฒด๋กœ ๋˜ ๊ฐ์ฒด๋ฅผ ๋”•์…”๋„ˆ๋ฆฌ๋กœ ๋ฐ”๊พธ๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์•˜๋Š”๋ฐ์š”.

 

ํ˜น์‹œ๋ผ๋„ ๋” ๋‚˜์€ ๋ฐฉ๋ฒ•์ด ์žˆ๊ฑฐ๋‚˜ ํ‹€๋ฆฐ ๋ถ€๋ถ„์ด ์žˆ๋‹ค๋ฉด ์–ธ์ œ๋“  ๋Œ“๊ธ€ ๋‹ฌ์•„์ฃผ์„ธ์š”!

728x90
๋ฐ˜์‘ํ˜•