Swift/Xcode

[Swift] UserDefaults

yeggrrr๐Ÿผ 2024. 5. 25. 00:13


์ž‘์€ ํ”„๋กœ์ ํŠธ๋“ค์„ ๋งค์ผ ํ•˜๋‚˜์”ฉ ๋งŒ๋“ค๋ฉด์„œ,

UserDefaults๋กœ ์•ฑ์ด ์ข…๋ฃŒ๋˜์–ด๋„ ๋ฐ์ดํ„ฐ๊ฐ€ ๋‚จ์•„์žˆ์„ ์ˆ˜ ์žˆ๋„๋ก
๊ณ„์† ์ €์žฅ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•ด๋ณด๋ ค๊ณ  ํ–ˆ์Šต๋‹ˆ๋‹ค.ใ…Žใ…Ž

์•„์ง ์ต์ˆ™ํ•˜์ง€๋Š” ์•Š์ง€๋งŒ,
์ •๋ฆฌํ•˜๋ฉด์„œ ํ™•์‹คํžˆ ๊ธฐ์–ตํ•ด๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค!โ˜บ๏ธ

 



UserDefaults๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ์—ฌ๋Ÿฌ ๋ฐฉ์‹ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค.

๊ทธ ์ค‘ UserDefaults๋Š” ๋‹จ์ผ ๋ฐ์ดํ„ฐ ๊ฐ’(๊ฒฝ๋Ÿ‰)์„ ์ €์žฅํ•˜๋Š”๋ฐ ์ฃผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค!

์˜ˆ๋ฅผ ๋“ค๋ฉด,
์ž๋™ ๋กœ๊ทธ์ธ ์—ฌ๋ถ€, ์•Œ๋ฆผ ์ˆ˜์‹  ์—ฌ๋ถ€, ๊ฒฐ์ œ ์—ฌ๋ถ€, ์ด๋ฉ”์ผ, ๋‹‰๋„ค์ž„ ๋“ฑ ์‚ฌ์šฉ์ž ๊ธฐ๋ณธ ์„ค์ •์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ๋“ค์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ๋ฐ์ดํ„ฐ๋“ค์€ iOS ๋””๋ฐ”์ด์Šค ๊ธฐ๊ธฐ์— ์ €์žฅ๋˜๊ณ , ์•ฑ์„ ์‚ญ์ œํ•˜๊ฒŒ ๋˜๋ฉด ๋ฐ์ดํ„ฐ๋“ค๋„ ํ•จ๊ป˜ ์‚ญ์ œ๋ฉ๋‹ˆ๋‹ค.




์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋Š”์ง€ ๊ฐ„๋‹จํ•œ ์˜ˆ์‹œ๋ฅผ ํ†ตํ•ด ์ •๋ฆฌํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค!

๋จผ์ €! Storyboard์—์„œ


textField, Button, Label 2๊ฐœ๋ฅผ ๋ฐฐ์น˜ํ•ด์ฃผ๊ณ ,
textField์™€ Label 2๊ฐœ๋Š” outlet ์—ฐ๊ฒฐ์„ ํ•ด์คฌ์Šต๋‹ˆ๋‹ค.


๊ทธ๋ฆฌ๊ณ  button์€ IBAction์„ ์—ฐ๊ฒฐํ•ด์ฃผ๊ณ ,

textField์— text๋ฅผ ์ž…๋ ฅํ•˜๊ณ  ์ €์žฅ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด, (ํฐ์ƒ‰ - titleLabel)์— ๋‚˜์˜ฌ ์ˆ˜ ์žˆ๋„๋ก ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. 

๊ทธ๋ฆฌ๊ณ  ์ €์žฅํ•œ ๋ฐ์ดํ„ฐ๋Š” (๋ถ„ํ™ - saveLabel)์— ๋ณด์—ฌ์ง€๋„๋ก ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

import UIKit

class ViewController: UIViewController {
    @IBOutlet var inputTextField: UITextField!
    @IBOutlet var titleLabel: UILabel!
    @IBOutlet var saveLabel: UILabel!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        }
    }
    
    @IBAction func saveButtonClicked(_ sender: UIButton) {
        guard let something = inputTextField.text else { return }
        titleLabel.text = something
        inputTextField.text = ""
    }
}

0



๊ทผ๋ฐ, ์ด๋ ‡๊ฒŒ ์ž…๋ ฅ์„ ํ•ด๋†“์•„๋„

์ด๋Œ€๋กœ ์•ฑ์„ ์ข…๋ฃŒํ•˜๋ฉด, ์ € ํ™”๋ฉด ๊ทธ๋Œ€๋กœ ๋‚จ์•„์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

0


UserDefaults๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์•ฑ์„ ์ข…๋ฃŒํ•˜๋”๋ผ๋„
(ํฐ์ƒ‰ - titleLabel)์— ์žˆ๋Š” ๋‚ด์šฉ์„
(๋ถ„ํ™ - saveLabel)์— ์ €์žฅ ๋ฆฌ์ŠคํŠธ๊ฐ€ ๋œฐ ์ˆ˜ ์žˆ๋„๋ก ์ €์žฅํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค!




1. UserDefaults์— ๋ฐ์ดํ„ฐ ์ €์žฅํ•˜๊ธฐ

UserDefaults.standard.setValue
or
UserDefaults.standard.set

๋‘˜ ๋‹ค ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋ฉฐ!
value ๋งค๊ฐœ๋ณ€์ˆ˜์— Integer, Double, String ๋“ฑ ๋‹ค์–‘ํ•œ ํƒ€์ž…์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ €์žฅํ•  ๋•Œ๋Š”
์–ด๋–ค ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ• ๊ฑด์ง€, key๊ฐ’์€ ๋ฌด์—‡์œผ๋กœ ํ•  ๊ฒƒ์ธ์ง€!
์ด ๋‘๊ฐ€์ง€๋งŒ ๋ช…ํ™•ํ•˜๊ฒŒ ์ž…๋ ฅํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.




2. UserDefaults์—์„œ ์ €์žฅํ•œ ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ

๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ฌ ๋•Œ๋Š” ์œ„ ํ™”๋ฉด๊ณผ ๊ฐ™์ด ๋ช…ํ™•ํ•œ ํƒ€์ž…์„ ์ •ํ•ด์ค˜์•ผํ•ฉ๋‹ˆ๋‹ค.
(object, string, bool, integer, ๋“ฑ๋“ฑ ...)

๊ทธ๋ฆฌ๊ณ , ์ €์žฅํ•  ๋•Œ ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ–ˆ๋˜ key๊ฐ’๊ณผ ๋Œ€์‘ํ•˜๋Š” ๊ฐ’์ด ์—†์„ ์ˆ˜ ์žˆ์œผ๋‹ˆ
๋ฐ˜ํ™˜๊ฐ’์ด ์˜ต์…”๋„(Optional)์ž…๋‹ˆ๋‹ค.

์˜ต์…”๋„์ด ์•„๋‹Œ ๊ฒฝ์šฐ๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
(Bool, Integer, Double)

์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ์—๋Š” ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ
Bool์€ false, Integer์™€ Double์€ 0์œผ๋กœ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.



๊ทธ๋Ÿผ ๋‹ค์‹œ ์ด์–ด์„œ ์œ„ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ

textField์— ์ž…๋ ฅํ–ˆ๋˜ ๊ฐ’๋“ค์„ ์ €์žฅํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.โ˜บ๏ธ

var someArray: [String] = []


๊ฐ’์„ ์ €์žฅํ•  'someArray'๋ผ๋Š” ๋ฐฐ์—ด์„ ๋งŒ๋“ค๊ฒ ์Šต๋‹ˆ๋‹ค.

๊ทธ ๋‹ค์Œ!


์ €์žฅ ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €์„ ๋•Œ!! 
textField์— ์ ์€ text๊ฐ€ someArray์— ์ถ”๊ฐ€๋˜๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

    
    @IBAction func saveButtonClicked(_ sender: UIButton) {
        guard let something = inputTextField.text else { return }
        someArray.append(something)
        titleLabel.text = something
        inputTextField.text = ""
    }


someArray.append(something)
์ด ํ•œ ์ค„๋งŒ ์ถ”๊ฐ€ํ•˜๋ฉด ๋˜๊ฒ ์ฃ ?


๊ทธ ๋‹ค์Œ! UserDefaults ์ €์žฅํ•˜๋Š” ๋ฉ”์„œ๋“œ ํ•œ ์ค„๋งŒ ์ž‘์„ฑํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค!

UserDefaults.standard.setValue(someArray, forKey: "something")


" 'someArray'๋ฅผ ์ €์žฅํ• ๊ฑฐ๊ณ ,
๊ทธ ์ €์žฅํ•  ๊ณณ ์ด๋ฆ„์„ 'something'์ด๋ผ๊ณ  ๋ถ€๋ฅผ๊ฒŒ!"

์ด๋ ‡๊ฒŒ ์ƒ๊ฐํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.



์ด์ œ ์ €์žฅํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

์•ฑ์„ ์ข…๋ฃŒํ–ˆ๋‹ค๊ฐ€ ์ €์žฅํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ๊ทธ๋Œ€๋กœ ๋ณด์—ฌ์ง€๋ ค๋ฉด,
viewDidLoad์—์„œ ๋ณด์—ฌ์ค˜ํ•ฉ๋‹ˆ๋‹ค.

์•ฑ์ด ์ฒ˜์Œ ์‹œ์ž‘๋  ๋•Œ, ์ตœ์ดˆ๋กœ ๋”ฑ ํ•œ ๋ฒˆ๋งŒ ์‹คํ–‰๋˜๋Š” ๊ณณ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค!

override func viewDidLoad() {
        super.viewDidLoad()
        
        let a = UserDefaults.standard.array(forKey: "something")
        if let array = a as? [String] {
            someArray = array
            saveLabel.text = "\(array)"
        }
    }


์ €๋Š” ์ด๋ ‡๊ฒŒ ํ•œ ๋ฒˆ ์ž‘์„ฑํ•ด๋ดค์Šต๋‹ˆ๋‹ค.
๋ฐ์ดํ„ฐ๋ฅผ ๋ฐฐ์—ด๋กœ ๊ฐ€์ง€๊ณ  ์˜ฌ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์—, array(forKey:)๋ฅผ ์‚ฌ์šฉํ•ด์คฌ์Šต๋‹ˆ๋‹ค.

a๋Š” ์˜ต์…”๋„ Any ํƒ€์ž…์ž…๋‹ˆ๋‹ค.

Stirng ๋ฐฐ์—ด ํƒ€์ž…์ธ SomeArray์— ๋„ฃ์–ด์ฃผ์–ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์—
if let์„ ์‚ฌ์šฉํ•ด์คฌ์Šต๋‹ˆ๋‹ค.

" 'something'์ด๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ์ €์žฅํ•œ ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์™€์„œ ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ 'a'์— ๋„ฃ์„๊ฑด๋ฐ,
๋งŒ์•ฝ ๊ทธ๊ฒŒ [String] ํƒ€์ž…์ด ์•„๋‹ˆ๋ฉด nil๋กœ ์ฒ˜๋ฆฌํ•˜๊ณ , ๋งž์œผ๋ฉด array๋ผ๊ณ  ๋ถ€๋ฅผ๊ฑฐ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ๊ทธ ๊ฐ€์ ธ์˜จ array๋ฅผ someArray๋ผ๋Š” ๋ฐฐ์—ด(์ €์žฅ ๊ณต๊ฐ„)์— ๋„ฃ์„๊ฑฐ๋‹ค!"

์ด๋ ‡๊ฒŒ ์ €์žฅํ•œ ๋ฐ์ดํ„ฐ๋ฅผ someArray์— ์ดˆ๊ธฐํ™” ํ–ˆ์œผ๋‹ˆ,
saveLabel์— ๋œฐ ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋ฉด ๋์ž…๋‹ˆ๋‹ค! :-)

0


์ด๋ ‡๊ฒŒ textField์— ์ž…๋ ฅํ•˜๊ณ , ์ €์žฅ ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ์ฃผ๋ฉด!

์ž…๋ ฅํ–ˆ๋˜ ๋ฌธ๊ตฌ๋“ค์ด ์•ฑ์„ ์ข…๋ฃŒํ–ˆ๋‹ค๊ฐ€ ๋‹ค์‹œ ์‹คํ–‰ํ•ด๋„ ๋‚จ์•„์žˆ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.



 


๋‹ค์Œ ๊ฒŒ์‹œ๊ธ€์—์„œ๋Š” 

๊ตฌ์กฐ์ฒด(struct)๋ฅผ UserDefaults๋กœ ์ €์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ ์ •๋ฆฌํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค!


 

 


โ˜บ๏ธํ”ผ๋“œ๋ฐฑ์ด ์žˆ๋‹ค๋ฉด, ๋Œ“๊ธ€ ๋‚จ๊ฒจ์ฃผ์„ธ์š”โ˜บ๏ธ


 

728x90