코딩

swift UserDefaults 대해 공부해보자.

kingarthur 2024. 7. 16. 21:05

스위프트에는 디스크에 저장할 수 있는 프레임 워크는 크게 두가지 나누는데 그중 하나라고 생각하면된다.

 

그리고 UserDefaults는 코어데이터 보다 간랸하게 사용이 가능하나 

 

단점이 있다. 복잡한 로직에는 사용이 불가능하며 보통 키값을 받는 정도에만 사용하는게 좋다고 이야기한다. 

 

클래스나 스트럭트 사용할때는 제이슨을 사용해서 하는 방법이 있긴하나 

 

오류의 원인이 될 수 있으니 내가 만드는 앱의 기준을 잘 보고 둘 중에 어떤걸 사용할지 결정하면 될 것 같다. 

 

그 기준은 키값이나 클래스에 서브클래스 까지 들어가면 UserDefaults 사용하기 힘들지 않을까 생각한다. 

 

간략하게 정의하면 

  • UserDefaults 또한 디스크에 데이터를 저장할 수 있게 돕는 도구.
  • CoreData 보다 사용성이 간단.
  • key 와 value 를 이용해서 값을 저장.
  • 대량의 데이터를 담는데에는 CoreData 가, 비교적 단순한 데이터를 담는 데에는 UserDefaults 가 적절. 

이렇게 보면 될 것 같다. 

 

UserDefaults 의 CRUD

  • UserDefaults.standard.set() 메서드를 통해서 Create, Update
  • UserDefaults.standard.string(forKey: "") 메서드를 통해서 Read (각 타입에 맞는 메서드사용)
    • bool 타입 Read: UserDefaults.standard.bool(forKey: "")
    • Int 타입 Read: UserDefaults.standard.integer(forKey: "")
  • UserDefaults.standard.removeObject(forKey: "") 메서드를 통해서 Delete

예시로는 이렇게 사용을 한다.

```swift
import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        // Create
        UserDefaults.standard.set("010-1111-2222", forKey: "phoneNumber")
        
        // Read
        let phoneNumber = UserDefaults.standard.string(forKey: "phoneNumber")
        print("저장된 전화번호: \(phoneNumber)")
        
        // Update
        // 같은 키에다가 set 을 하면 됨.
        UserDefaults.standard.set("010-6666-7777", forKey: "phoneNumber")
        let newPhoneNumber = UserDefaults.standard.string(forKey: "phoneNumber")
        print("바뀐 전화번호: \(newPhoneNumber)")
        
        // Delete
        UserDefaults.standard.removeObject(forKey: "phoneNumber")
        print("전화번호가 남아있는가: \(UserDefaults.standard.string(forKey: "phoneNumber"))")
    }
}
```

 

아까도 말했지만 Int, String 과 같은 원시타입이 아닌 StructClass 타입을 저장하기 위해서는 json 인코딩 과정이 필요하다.

 

간단하게 메모지 기능을 만들어 볼 수 있다. 

 

import UIKit
import SnapKit

class ViewController: UIViewController {
    
    private let label: UILabel = {
        let label = UILabel()
        label.text = "포스트잇"
        label.font = .boldSystemFont(ofSize: 30)
        label.textColor = .black
        return label
    }()
    
    private let textView: UITextView = {
        let textView = UITextView()
        textView.text = UserDefaults.standard.string(forKey: "memo")
        textView.layer.cornerRadius = 10
        textView.backgroundColor = UIColor(red: 75/255, green: 253/255, blue: 30/355, alpha: 1.0)
        textView.font = .boldSystemFont(ofSize: 30)
        return textView
    }()
    
    private lazy var button: UIButton = {
        let button = UIButton()
        button.setTitle("적용", for: .normal)
        button.backgroundColor = .red
        button.setTitleColor(.white, for: .normal)
        button.titleLabel?.font = .boldSystemFont(ofSize: 30)
        button.layer.cornerRadius = 10
        button .addTarget(self, action: #selector(buttonTapped), for: .touchUpInside )
        return button
    }()

    override func viewDidLoad() {
        super.viewDidLoad()
        configureUI()
    }
    
    private func configureUI() {
        [label,
         textView,
         button
        ].forEach { view.addSubview($0)}
        
        view.backgroundColor = .white
        
        label.snp.makeConstraints {
            $0.top.equalToSuperview().offset(100)
            $0.centerX.equalToSuperview()
        }
        
        textView.snp.makeConstraints {
            $0.top.equalTo(label.snp.bottom).offset(50)
            $0.centerX.equalToSuperview()
            $0.height.width.equalTo(200)
        }
        
        button.snp.makeConstraints {
            $0.top.equalTo(textView.snp.bottom).offset(50)
            $0.width.equalTo(60)
            $0.height.equalTo(40)
            $0.centerX.equalToSuperview()
        }
    }
    @objc
    private func buttonTapped() {
        UserDefaults.standard.set(textView.text, forKey:  "memo")
        print("저장완료")
    }

}

 

나는 스냅킵 라이브러리를 사용해서 만들어 보았다. 

 

이번 처럼 코어데이터 파일로 생성해주면 된다. 

 

아직 배워야 될 것이 너무 많은 것같다. 

 

내 생각에는 IT 배움은 시작만 있을뿐이다 ㅋㅋㅋㅋ

반응형