๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
SeSAC

[iOS] TIL_230726

by lizzydev 2023. 7. 31.

ํƒœ๊ทธ ์‚ฌ์šฉํ•˜๊ธฐ

์ฝ”๋“œ๋กœ ํƒœ๊ทธ ์ง€์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•

ํ…์ŠคํŠธํ•„๋“œ IBAction ์—ฐ๊ฒฐ ์‹œ ์ฃผ์˜์‚ฌํ•ญ

์œ„์— ์ฒซ๋ฒˆ์งธ ํ…์ŠคํŠธ ํ•„๋“œ์—์„œ ๋Œ์–ด๋‹ค๊ฐ€ Did End On Exit ์ด๋ฒคํŠธ๋กœ ์„ค์ •ํ•ด์„œ IBAction ํ•จ์ˆ˜ ๋งŒ๋“ค์—ˆ๋”๋ผ๋„

๋‘๋ฒˆ์งธ ํ…์ŠคํŠธ ํ•„๋“œ์— ์‚ฌ์ง„์ฒ˜๋Ÿผ ๋Œ์–ด๋‹ค ๋„ฃ์–ด์ฃผ๋ฉด default ์•ก์…˜์ธ Editing Did End ๋กœ ์„ค์ • ๋จ. ์ธ์ŠคํŽ™ํ„ฐ์—์„œ ์›ํ•˜๋Š” ์•ก์…˜์œผ๋กœ ์ˆ˜์ • ํ•ด์ฃผ๋˜์ง€ ์ธ์ŠคํŽ™ํ„ฐ์—์„œ ๋Œ์–ด๋‹ค ์—ฐ๊ฒฐ

guard ๋ฌธ

guard ๋ฌธ์€ ์˜ˆ์™ธ์ฒ˜๋ฆฌ๊ฐ€ ์•„๋ž˜์ชฝ ์•„๋‹Œ ์ฝ”๋“œ์œ„์ชฝ์—์„œ ์ผ์–ด๋‚จ.

guard ๋ฌธ์€ return ์•ˆ ํ•ด์ฃผ๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์˜ค๋ฅ˜๋‚จ.

ํƒœ๊ทธ๊ฐ’ ์—ด๊ฑฐํ˜•์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ธฐ

  1. ํ…์ŠคํŠธ ํ•„๋“œ ๋“ค์— ์“ธ ํƒœ๊ทธ ๊ฐ’๋“ค ์—ด๊ฑฐํ˜• rawValue์— ๋ฏธ๋ฆฌ ์ง€์ •
enum TextFieldType: Int {     
	case id = 100     
	case email = 200     
	case password = 300 
}
  1. ์•ก์…˜ํ•จ์ˆ˜ ์‹คํ–‰ ์‹œ ํƒœ๊ทธ ๊ฐ’์— ๋”ฐ๋ผ ์—ด๊ฑฐํ˜• ๊ฐ’๊ณผ ๋น„๊ตํ•˜์—ฌ ์ฒ˜๋ฆฌ
@IBAction func textFieldKeyboardTapped(_ sender: UITextField) {         	
	guard let text = sender.text else {          
    	print("์•„์ด๋””๊ฐ€ ์ž…๋ ฅ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.")             
		return         
	}                 
	switch sender.tag {         
		case TextFieldType.id.rawValue : print("์•„์ด๋””๋Š” \(idTextField.text!) ์ž…๋‹ˆ๋‹ค.")         
		case TextFieldType.email.rawValue : print("์ด๋ฉ”์ผ์€ \(emailTextField.text!) ์ž…๋‹ˆ๋‹ค.")  
		case TextFieldType.password.rawValue : print("๋น„๋ฐ€๋ฒˆํ˜ธ๋Š” \(passwordTextfield.text!)")  
		default: print("์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.")//์˜ˆ์™ธ์ฒ˜๋ฆฌ        
    } 
}

์œ„์˜ default ์˜ˆ์™ธ์ฒ˜๋ฆฌ ๋ถ€๋ถ„ guard ๋ฌธ์œผ๋กœ ํ•˜๋Š” ๋ฒ•

@IBAction func textFieldKeyboardTapped(_ sender: UITextField) {         
	guard let text = sender.text else {             
		print("์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.")             
		return         
	} 				
//rawValue ์ด์šฉํ•ด์„œ ๋“ค์–ด์˜จ ์•ก์…˜์˜ sender.tag๊ฐ€ TextFieldType ์—ด๊ฑฐํ˜•์— ์žˆ๋Š” ๊ฐ’์ธ์ง€ ํ™•์ธ 				//์—†๋Š” ๊ฐ’์ด๋ฉด ์˜ค๋ฅ˜ ๋ฐœ์ƒ ์žˆ๋Š” ๊ฐ’์ด๋ฉด ์–ด๋–ค          guard let textFieldCase = TextFieldType(rawValue: sender.tag) else {             print("์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.")             return         } 				//case๋ฌธ์— default ์•ˆ ๋„ฃ์–ด์ค˜๋„ ์˜ค๋ฅ˜ ์•ˆ ๋‚˜๊ฒŒ ๋จ. 				//์œ„์—์„œ ๊บผ๋‚ธ value ๊ฐ’์— ๋”ฐ๋ฅธ ์กฐ๊ฑด๋ฌธ ์ฒ˜๋ฆฌ         switch textFieldCase {         case .id : print("์•„์ด๋””๋Š” \(text) ์ž…๋‹ˆ๋‹ค.")         case .email : print("์ด๋ฉ”์ผ์€ \(text) ์ž…๋‹ˆ๋‹ค.")         case .password : print("๋น„๋ฐ€๋ฒˆํ˜ธ๋Š” \(text)")         } }
let textFieldCase = TextFieldType(rawValue: 0) 
  • ์ธ์ž๋กœ ๋“ค์–ด ์˜จ ์ˆซ์ž๋ฅผ rawvalue๋กœ ๊ฐ€์ง€๋Š” ์—ด๊ฑฐํ˜•์ผ€์ด์Šค ๊ฐ’์„ ๋ฐ˜ํ™˜ ํ•จ

guard ๋ฌธ ๋‘ ๋ฒˆ ์“ฐ๋˜๊ฑฐ ํ•œ๋ฒˆ์— ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•

guard let text = sender.text, let value = TextFieldType(rawValue: sender.tag)  else {             
	print("์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.")             
	return         
}

Saving Data

์•ฑ์„ ์„ค์น˜ํ•˜๋ฉด ์•„์ดํฐ ์ €์žฅ๊ณต๊ฐ„์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋จ. (์„ค์ • - ์ผ๋ฐ˜ - ์ •๋ณด - ์‚ฌ์šฉ๊ฐ€๋Šฅ ๊ณต๊ฐ„)

์•ฑ๋“ค์— ๋ณดํ†ต ๋ฐฑ์—…/๋ณต๊ตฌ ๊ธฐ๋Šฅ ๊ตฌํ˜„๋˜์–ด์žˆ์Œ.

UserDefaults

๋‹จ์ผ ๋ฐ์ดํ„ฐ ๊ฐ’ (๊ฒฝ๋Ÿ‰)

DataBase

์œ ์‚ฌํ•œ ๋Œ€๋Ÿ‰ ๋ฐ์ดํ„ฐ ๊ฐ’ (์ค‘๋Ÿ‰)

๊ฐœ๋ฐœ์ž๋Š” ์ž๊ธฐ์•ฑ ๋ฐ์ดํ„ฐ๊ฐ€ ์ •ํ™•ํžˆ ์–ด๋”” ์ €์žฅ๋˜๋Š”์ง€ ์•Œ ์ˆ˜ ์—†์Œ. ์œ ๋™์ ์œผ๋กœ ๋ณ€ํ™”ํ•จ

→์ด ๋ถ€๋ถ„์„ ์• ํ”Œ์ด ๋„์™€์คŒ : Sandbox

UserDefaults

์ €์žฅํ•˜๊ธฐ

@IBAction func saveButtonClicked(_ sender: Any) {         
	UserDefaults.standard.set(idTextField.text!, forKey: "id")         
	UserDefaults.standard.set(emailTextField.text!, forKey: "email")         
	UserDefaults.standard.set(passwordTextfield.text!, forKey: "name") 
}

๋ถˆ๋Ÿฌ์˜ค๊ธฐ

override func viewDidLoad() { 				
	let name = UserDefaults.standard.string(forKey: "id")         
	let email = UserDefaults.standard.string(forKey: "email")         
	let password = UserDefaults.standard.string(forKey: "password")  				
	if let name {             
		idTextField.text = name         
	}         
	if let email {             
		emailTextField.text = email         
	}                  
	if let password {            
		passwordTextfield.text = password         
	} 
}

ํƒ€์ž…๋ณ„ UserDefaults

string๋งŒ ์˜ต์…”๋„(String?)์ด๋ผ nil๊ฐ’ ๊ฐ€์ง.

integer,bool์€ Int,Bool

Class

  • ํด๋ž˜์Šค์˜ ๊ฐ€์žฅ ํฐ ํŠน์ง• → ์ƒ์†
  • Base Class: ํƒœ์ดˆ๋กœ ์•„๋ฌด๊ฒƒ๋„ ์ƒ์† ๋ฐ›๊ณ  ์žˆ์ง€ ์•Š์€ ํด๋ž˜์Šค
  • override : ๋ถ€๋ชจํด๋ž˜์Šค๋กœ๋ถ€ํ„ฐ ๋ฌผ๋ ค๋ฐ›์€ ์š”์†Œ๋ฅผ ์ž์‹ํด๋ž˜์Šค์—์„œ ์‚ฌ์šฉํ•  ๋–„, ์ž์‹ํด๋ž˜์Šค๋งŒ์˜ ๊ธฐ๋Šฅ์œผ๋กœ ๋ณ€๊ฒฝํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • super.viewDidLoad() ์ฃผ์„ ์ฒ˜๋ฆฌํ•ด๋„ ๋‹น์žฅ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธฐ์ง€ ์•Š๋”๋ผ๋„ ์–ธ์  ๊ฐ„ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ์Œ.
  • ํด๋ž˜์Šค ๋‚ด ๋ชจ๋“  ํ”„๋กœํผํ‹ฐ๋Š” ์ดˆ๊ธฐํ™”๊ฐ€ ๋˜์–ด ์žˆ์–ด์•ผ ํ•œ๋‹ค. → but ์˜ต์…”๋„ ํƒ€์ž…์œผ๋กœ ํ•ด ๋†“์œผ๋ฉด nil์ด ๋“ค์–ด๊ฐ€์„œ ์˜ค๋ฅ˜ ์•ˆ ๋‚จ. ํ•˜์ง€๋งŒ ๋‹น์žฅ ํ•ด๊ฒฐ์ด ๋œ๋‹ค ํ•˜๋”๋ผ๋„ ๋‚˜์ค‘์— ์˜ต์…”๋„ ์ฒ˜๋ฆฌํ•ด์ค˜์•ผํ•˜๋Š” ๊ฒƒ์ด ๋ถˆํŽธํ•˜๋ฏ€๋กœ ์‚ฌ์šฉ ์ž์ œ
  • ํด๋ž˜์Šค ๋‚ด๋ถ€์— ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋ฅผ ํ”„๋กœํผํ‹ฐ, ํ•จ์ˆ˜๋ฅผ ๋ฉ”์„œ๋“œ๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.
  • iOS UIKit ํ”„๋ ˆ์ž„์›Œํฌ ๋Œ€๋ถ€๋ถ„ ํด๋ž˜์Šค
  1. ์„ ์–ธ๊ณผ ๋™์‹œ์— ์ดˆ๊ธฐํ™”๋ฅผ ์ง„ํ–‰ํ•˜๊ธฐ
  2. ์˜ต์…”๋„๋กœ ์„ ์–ธํ•˜๊ธฐ
  3. ๋งค๊ฐœ๋ณ€์ˆ˜. ์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ ๋งŒ๋“ค๊ธฐ

๋ณ€์ˆ˜ ์„ ์–ธํ•  ๋•Œ ์ดˆ๊ธฐํ™” ์•ˆํ•˜๋ฉด ์˜ค๋ฅ˜๋‚จ

but ์˜ต์…”๋„ ํƒ€์ž…์œผ๋กœ ํ•ด ๋†“์œผ๋ฉด nil์ด ๋“ค์–ด๊ฐ€์„œ ์˜ค๋ฅ˜ ์•ˆ ๋‚จ. ํ•˜์ง€๋งŒ ๋‹น์žฅ ํ•ด๊ฒฐ์ด ๋œ๋‹ค ํ•˜๋”๋ผ๋„ ๋‚˜์ค‘์— ์˜ต์…”๋„ ์ฒ˜๋ฆฌํ•ด์ค˜์•ผํ•˜๋Š” ๊ฒƒ์ด ๋ถˆํŽธํ•จ

๋Œ€์‹ ์— initializer ๋”ฐ๋กœ ๋งŒ๋“ค๋ฉด ๋จ. ์ƒ์„ฑ ๋  ๋•Œ ๋ฌด์กฐ๊ฑด ๊ฐ’์ด ๋“ค์–ด๊ฐˆ ๊ฒƒ ์ด๊ธฐ ๋•Œ๋ฌธ

self ์จ์ค˜์•ผ ์˜ค๋ฅ˜ ์•ˆ๋‚จ .

Struct

  • Swift์˜ Data Type๊ณผ ์—ด๊ฑฐํ˜•→Struct

์ดˆ๊ธฐํ™” ์•ˆํ•˜๊ณ  ์„ ์–ธ๋งŒ ํ•˜๊ณ  ์ƒ์„ฑ์ž ์—†์–ด๋„ ์˜ค๋ฅ˜ ์•ˆ ๋‚จ

๋ฉค๋ฒ„์™€์ด์ฆˆ ์ด๋‹ˆ์…œ๋ผ์ด์ € ๊ตฌ๋ฌธ ์ œ๊ณต - ์ž๋™์œผ๋กœ ์ด๋‹ˆ์…œ๋ผ์ด์ € ์ƒ๊น€

๋งŒ์•ฝ์— ์ดˆ๊ธฐํ™” ๋˜์–ด์žˆ๋Š” ํ”„๋กœํผํ‹ฐ๋“ค ์žˆ์œผ๋ฉด ๊ฑ”๋„ค๋“ค๋งŒ ์ด๋‹ˆ์…œ๋ผ์ด์ €์— ํฌํ•จ ๋จ.

์ฑ„์šฉ๊ณผ์ œ์—์„œ struct ์ธ๋ฐ ํด๋ž˜์Šค์ฒ˜๋Ÿผ init ํ•จ์ˆ˜ ๊ตฌํ˜„ํ•ด ๋†“์œผ๋ฉด ๊ธฐ๋ณธ์ ์ธ ๊ฒƒ์„ ๋ชจ๋ฅธ๋‹ค๊ณ  ์ƒ๊ฐ ํ•  ์ˆ˜๋„ .

  • nickname๊ณผ subNickname ์€ ๊ฐ๊ฐ ๋‹ค๋ฅธ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ์— ์ €์žฅ ๋˜์–ด์žˆ์–ด์„œ ์„œ๋กœ ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์Œ .

Class

์ƒˆ๋กœ ์ƒ๊ธด baby์™€ secondBaby ๋Š” ๊ฐ์ž ๋‹ค๋ฅธ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ์ฐจ์ง€ํ•˜์ง€๋งŒ ๊ทธ ๋ฉ”๋ชจ๋ฆฌ์œ„์— ์จ์žˆ๋Š”๊ฒŒ ํด๋ž˜์Šค ๊ฐ’ ์ž์ฒด๊ฐ€ ์•„๋‹ˆ๋ผ ๋‹ค๋ฅธ ๋ฉ”๋ชจ๋ฆฌ(ํด๋ž˜์Šค์˜ ๊ฐ’๋“ค์ด ๋“ค์–ด์žˆ๋Š” ๊ณณ)์˜ ์ฃผ์†Œ๊ฐ’์ด ๋˜‘๊ฐ™์ด ๋“ค์–ด๊ฐ€ ์žˆ์Œ.

→ ๊ฐ™์€ ๊ฐ’์„ ์ฐธ์กฐํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ ์„œ๋กœ ์˜ํ–ฅ ์คŒ.

Struct

let์œผ๋กœ ์„ ์–ธ์‹œ ์ธ์Šคํ„ด์Šค ๋‚ด๋ถ€์˜ ํ”„๋กœํผํ‹ฐ ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋‹ค.

'SeSAC' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[iOS] TIL_230728  (0) 2023.08.01
[iOS] TIL_230727  (0) 2023.07.31
[iOS] TIL_230725  (0) 2023.07.30
[iOS] TIL_230719  (0) 2023.07.25
[iOS] TIL_230718  (0) 2023.07.20