본문 바로가기
Xcode/IOS

IOS) UserDefault로 간단한 내용을 저장하자!

by 후르륵짭짭 2020. 8. 11.
728x90
반응형

안녕하세요 후르륵짭짭 입니다!!!

이번에는 위에 이미지 처럼 앱을 종료시켜도 내용을 저장할 수 있는

UserDefault 에 대해서 배워 보려고 합니다.

UserDefault는 간단한 정보를 저장할 때 주로 사용합니다.

Sqlite나 CoreData 같은 경우에는 테이블 구조도 있고 거대한 정보를 저장할 때 사용한다면

UserDefault는 정말 작은 정보를 저장 할 때 사용합니다.

 

** SingleData 저장하기 **

 싱글 데이터를 저장한 다는 것은 Float , Int, Double, Bool 형 같은 것을 저장 할때 사용 합니다.

    @IBOutlet weak var amountLabel: UILabel!
    @IBOutlet weak var targetSlider: UISlider!
   
    
    let targetSliderValue = "targetSlider"

    override func viewDidLoad() {
        super.viewDidLoad()
        
        
        if let istargetSliderValue = UserDefaults.standard.value(forKey: targetSliderValue){
            
            targetSlider.value = istargetSliderValue as! Float
            sliderAction(targetSlider)
        }
       
    }
    
        @IBAction func sliderAction(_ sender: UISlider) {

        let value = Int(ceil( sender.value ))
        
        amountLabel.text = String( value )
        
        UserDefaults.standard.set(sender.value, forKey: targetSliderValue)
       } 
       
        
  

이 코드를 보시면 UserDefaults.standard 가 있습니다.

UserDefaults.standard.set(sender.value, forKey: targetSliderValue)

바로 이것이 UserDefault를 선언하고 set을 해주면 저장 할 수 입니다.

이렇게 UserDefaults.standard.set(넣어줄 값 , 저장할 이름) 해주시면 됩니다.

그리고 값을 가지고 올 때는 값이 존재 하지 않을 수도 있으니

if let istargetSliderValue = UserDefaults.standard.value(forKey: targetSliderValue){}

옵셔널 바인딩 코드로 UserDefaults.standard.value(저장한 이름) 이렇게 해서 가져 오면 됩니다.

이때 가져온 값은 Any 타입이기 때문에 항상 as 로 다운케스팅 해주셔야합니다.

 

** 여러개의 값 저장하기 **

struct InfoToSave : Codable {
    
    let userName : String
    let switchValue : Bool
    
}

    var info : InfoToSave
            
        if value % 2 == 0 {
            info = InfoToSave(userName: "Hururuek", switchValue: true)
            self.nameLabel.text = "Hururuek"
            self.defaultswitch.isOn = true
        }
        else{
            info = InfoToSave(userName: "ChapChap", switchValue: false)
            self.nameLabel.text = "ChapChap"
            self.defaultswitch.isOn = false
        }
        
        
        do{
        let encoder = try JSONEncoder().encode(info)
            UserDefaults.standard.set(encoder, forKey: self.infoToSave)
        }
        catch let err{
            print("-->> Error : \(err.localizedDescription)")
        }

여러개의 값을 저장하기 위해서는 저렇게 Codable로 구조체를 만들어 줍니다.

그리고 JSONEncoder로 Data 타입으로 변형 시켜준 다음 

위에와 똑같이 UserDefaults.standard.set(저장할 값, 저장할 변수이름)

이렇게 저장 해주시면 됩니다.

가지고 올때는 value가 아닌 object로 가져오셔야합니다.

        if let isInfohasValue = UserDefaults.standard.object(forKey: infoToSave){
            do {
            let decoder = try JSONDecoder().decode(InfoToSave.self, from: isInfohasValue as! Data)
                nameLabel.text = decoder.userName
                defaultswitch.isOn = decoder.switchValue
            }
            catch let err{
                print("-->> Error : \(err.localizedDescription)")
            }
        }

그런 다음 JSONDecoder로 해독해주시면 됩니다.

 

** 데이터 삭제하기 **

    @IBAction func removeBtn(_ sender: UIButton) {
        UserDefaults.standard.removeObject(forKey: infoToSave)
        UserDefaults.standard.removeObject(forKey: targetSliderValue)
        print("removed")
    }

데이터 삭제는 너무 쉽습니다. 그냥 removeObject(저정한 이름) 이렇게 해주시면 됩니다.

 

** 전체 코드 **

import UIKit

class UserDefaultViewController: UIViewController {

    @IBOutlet weak var nameLabel: UILabel!
    @IBOutlet weak var amountLabel: UILabel!
    @IBOutlet weak var targetSlider: UISlider!
    @IBOutlet weak var defaultswitch: UISwitch!
    
    let targetSliderValue = "targetSlider"
    let infoToSave = "infoToSave"
    override func viewDidLoad() {
        super.viewDidLoad()
        
        
        if let istargetSliderValue = UserDefaults.standard.value(forKey: targetSliderValue){
            
            targetSlider.value = istargetSliderValue as! Float
            sliderAction(targetSlider)
        }
        
        if let isInfohasValue = UserDefaults.standard.object(forKey: infoToSave){
            do {
            let decoder = try JSONDecoder().decode(InfoToSave.self, from: isInfohasValue as! Data)
                nameLabel.text = decoder.userName
                defaultswitch.isOn = decoder.switchValue
            }
            catch let err{
                print("-->> Error : \(err.localizedDescription)")
            }
        }

    
    }
    
    @IBAction func removeBtn(_ sender: UIButton) {
        UserDefaults.standard.removeObject(forKey: infoToSave)
        UserDefaults.standard.removeObject(forKey: targetSliderValue)
        print("removed")
    }
    
    
    @IBAction func sliderAction(_ sender: UISlider) {

        let value = Int(ceil( sender.value ))
        
        amountLabel.text = String( value )
        
        UserDefaults.standard.set(sender.value, forKey: targetSliderValue)
        
        
        DispatchQueue.main.async {
        
            var info : InfoToSave
            
        if value % 2 == 0 {
            info = InfoToSave(userName: "Hururuek", switchValue: true)
            self.nameLabel.text = "Hururuek"
            self.defaultswitch.isOn = true
        }
        else{
            info = InfoToSave(userName: "ChapChap", switchValue: false)
            self.nameLabel.text = "ChapChap"
            self.defaultswitch.isOn = false
        }
        
        
        do{
        let encoder = try JSONEncoder().encode(info)
            UserDefaults.standard.set(encoder, forKey: self.infoToSave)
        }
        catch let err{
            print("-->> Error : \(err.localizedDescription)")
        }
            
            }
        
    }

}

struct InfoToSave : Codable {
    
    let userName : String
    let switchValue : Bool
    
}
728x90
반응형

댓글