๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
โŒจ๏ธ Language/swift

[Swift] ์ฝœ๋ ‰์…˜ ํƒ€์ž…

by hyebin (Helia) 2024. 3. 16.
๋ฐ˜์‘ํ˜•

1. Array

๋ฐฐ์—ด์˜ ์ •์˜

  • swift์—์„œ ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ ์ค‘ ํ•˜๋‚˜
  • ๋™์ผํ•œ ์œ ํ˜•์˜ ๊ฐ’์˜ ์ˆœ์„œ๊ฐ€ ์žˆ๋Š” ์ฝœ๋ ‰์…˜ ํƒ€์ž…
  • ๊ฐ ์š”์†Œ๋Š” ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•ด ์ ‘๊ทผ ๊ฐ€๋Šฅ

๋ฐฐ์—ด์˜ ์„ ์–ธ๊ณผ ์ดˆ๊ธฐํ™”

  • ๋Œ€๊ด„ํ˜ธ([]) ๊ธฐํ˜ธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋นˆ ๋ฐฐ์—ด์„ ์„ ์–ธ
var numbers: [Int] = []
var numbers = [Int]()
  • ๋Œ€๊ด„ํ˜ธ([]) ์•ˆ์— ๊ฐ’์„ ์‰ผํ‘œ๋กœ ๊ตฌ๋ถ„ํ•˜์—ฌ ๋‚˜์—ด
var numbers = [1, 2, 3, 4, 5]
  • ๋ฐฐ์—ด์„ ์ดˆ๊ธฐํ™” ํ•  ๋•Œ, ํƒ€์ž… ์–ด๋…ธํ…Œ์ด์…˜(type annotation)์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐฐ์—ด์˜ ํƒ€์ž… ์ง€์ • ๊ฐ€๋Šฅ
var numbers: [Int] = [1, 2, 3, 4, 5]
  • Swift๋Š” ํƒ€์ž… ์ถ”๋ก (type inference)์„ ์ง€์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ํƒ€์ž…์„ ์ƒ๋žตํ•  ์ˆ˜ ์žˆ์Œ
    • ์ดˆ๊ธฐ๊ฐ’์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฐฐ์—ด์˜ ํƒ€์ž…์„ ์ถ”๋ก 
var numbers = [1, 2, 3, 4, 5] // numbers์˜ ํƒ€์ž…์€ [Int]๋กœ ์ถ”๋ก ๋ฉ๋‹ˆ๋‹ค.
  • ๋ฐฐ์—ด์— ๋‹ค๋ฅธ ํƒ€์ž…์˜ ์š”์†Œ๋“ค์„ ์ €์žฅํ•˜๋Š” ํ˜ผํ•ฉ๋ฐฐ์—ด ๋˜๋Š” Any ๋ฐฐ์—ด์„ ์ƒ์„ฑ ๊ฐ€๋Šฅ
    • ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ์š”์†Œ๊ฐ€ ๋™์ผํ•œ ์œ ํ˜•์˜ ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜๋Š”๊ฒƒ์ด ์ข‹์Œ
var mixedArray = [1, "two", 3.0]

 

๋ฐฐ์—ด ์š”์†Œ ์ ‘๊ทผ

  • ์ธ๋ฑ์Šค(index)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐฐ์—ด์˜ ์š”์†Œ์— ์ ‘๊ทผ
  • ๋ฐฐ์—ด์˜ ์ธ๋ฑ์Šค๋Š” 0๋ถ€ํ„ฐ ์‹œ์ž‘
var numbers = [1, 2, 3, 4, 5] 
let firstNumber = numbers[0] // 1 let secondNumber =numbers[1] // 2
  • ๋ฐฐ์—ด์˜ ๋งˆ์ง€๋ง‰ ์š”์†Œ์— ์ ‘๊ทผํ•˜๋ ค๋ฉด count ์†์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐฐ์—ด์˜ ๊ธธ์ด๋ฅผ ๊ฐ€์ ธ์˜จ ํ›„, ์ธ๋ฑ์Šค๋Š” count-1๋กœ ์„ค์ •
let lastNumber = numbers[numbers.count-1]

let n = [1, 2, 3]
print(n[1..<2]) //2
print(n[1...2]) //2, 3
  • ํŠน์ • ์ธ๋ฑ์Šค๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด์„œ๋Š” firstIndex(of: ) ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉ
    • ๋ฐฐ์—ด์— ๋™์ผํ•œ ์š”์†Œ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ, ๋” ์ž‘์€ ์ธ๋ฑ์Šค๋ฅผ ๋ฐ˜ํ™˜
    • optional ๊ฐ’์œผ๋กœ ๋ฐ˜ํ™˜
var arr = [1,2,3,4,5]
arr.firstIndex(of: 1) //Optional(0)

 

๋ฐฐ์—ด์— ์š”์†Œ ์ถ”๊ฐ€

  • ์ƒˆ๋กœ์šด ์š”์†Œ๋ฅผ ๋ฐฐ์—ด์— ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š”,  append()  ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉ
var numbers = [1, 2, 3, 4, 5] 
numbers.append(6) // 6์„ ๋ฐฐ์—ด์˜ ๋งˆ์ง€๋ง‰ ์š”์†Œ๋กœ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  • ํŠน์ • ์œ„์น˜์— ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š”,  insert()  ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉ
    • insert๋ฅผ ํ•˜๋Š” ์œ„์น˜๋ถ€ํ„ฐ ๋ฐฐ์—ด์„ ์žฌ๋ฐฐ์น˜ ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋ฐœ์ƒ
    • ๊ฐ€๋Šฅํ•œ append ์‚ฌ์šฉ
var arr = [1, 2, 3, 4, 5]
arr.insert(10, at: 3) //10์„ ๋ฐฐ์—ด์˜ 3๋ฒˆ์งธ์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
print(arr) //[1, 2, 3, 10, 4, 5]

 

๋ฐฐ์—ด์˜ ์ˆ˜์ •

  • ๋ฐฐ์—ด์˜ ์š”์†Œ๋ฅผ ์ˆ˜์ •ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๋‹น ์š”์†Œ์— ์ ‘๊ทผํ•œ ํ›„, ๊ฐ’์„ ๋ณ€๊ฒฝ
var numbers = [1, 2, 3, 4, 5] 
numbers[2] = 30 // ์„ธ ๋ฒˆ์งธ ์š”์†Œ๋ฅผ 30์œผ๋กœ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.ใ„ฑใ„ท๋ฐฐ
  • ๋ฐฐ์—ด์˜ ํŠน์ • ๋ฒ”์œ„์˜ ๊ฐ’์„ ์ˆ˜์ •ํ•˜๊ณ  ์‹ถ์„ ๋•Œ  replaceSubrange  ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ’์„ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ
var array2 = [1, 2, 3]
array2.replaceSubrange(0...2, with: [10, 20, 30])     // [10, 20, 30]
array2.replaceSubrange(0...2, with: [0])              // [0]
array2.replaceSubrange(0..<1, with: [])               // []

๋ฐฐ์—ด์˜ ์‚ญ์ œ

  • ๋ฐฐ์—ด์˜ ์š”์†Œ๋ฅผ ์‚ญ์ œํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š”,  remove()  ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉ
var numbers = [1, 2, 3, 4, 5] 
numbers.remove(at: 2) // ์„ธ ๋ฒˆ์งธ ์š”์†Œ๋ฅผ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.

numbers.removeFirst() //๋ฐฐ์—ด์˜ ์ฒซ ๋ฒˆ์งธ ์š”์†Œ๋ฅผ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.
numbers.removeLast()  //๋ฐฐ์—ด์˜ ๋งˆ์ง€๋ง‰ ์š”์†Œ๋ฅผ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.
numbers.removeAll()   //๋ฐฐ์—ด์˜ ๋ชจ๋“  ์š”์†Œ๋ฅผ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.
ํ•จ์ˆ˜ ์ด๋ฆ„ ์šฉ๋„ ๋ฆฌํ„ด ํƒ€์ž…
 remove(at:) ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›์€ index์— ํ•ด๋‹นํ•˜๋Š” ๊ฐ’ ์‚ญ์ œ ์‚ญ์ œ๋œ ๊ฐ’ ๋ฆฌํ„ดNon-Optional Type
 removeFirst ์ฒซ ๋ฒˆ์งธ ์š”์†Œ ์‚ญ์ œ ์‚ญ์ œ๋œ ๊ฐ’ ๋ฆฌํ„ดNon-Optional Type
 removeFirst(_:) ์ฒซ ๋ฒˆ์งธ ์š”์†Œ๋ถ€ํ„ฐ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›์€ ๊ฐฏ์ˆ˜ ๋งŒํผ ์‚ญ์ œ X
 removeLast  ๋งˆ์ง€๋ง‰ ์š”์†Œ ์‚ญ์ œ ์‚ญ์ œ๋œ ๊ฐ’ ๋ฆฌํ„ดNon-Optional Type
 popLast ๋งˆ์ง€๋ง‰ ์š”์†Œ ์‚ญ์ œ ์‚ญ์ œ๋œ ๊ฐ’ ๋ฆฌํ„ดNon-Optional Type
 removeLast(_:) ๋งˆ์ง€๋ง‰ ์š”์†Œ๋ถ€ํ„ฐ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›์€ ๊ฐฏ์ˆ˜ ๋งŒํผ ์‚ญ์ œ X
 removeAll ์ „์ฒด ์š”์†Œ ์‚ญ์ œ X
 removeSubrange(_:) ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›์€ ๋ฒ”์œ„๋งŒํผ index ์š”์†Œ ์‚ญ์ œ X
 [n...m] = []
Subscript ๋ฌธ๋ฒ•์œผ๋กœ n ~ m๊นŒ์ง€ index ์š”์†Œ ์‚ญ์ œ X

 

๋ฐฐ์—ด์˜ ๊ธฐํƒ€ ๊ธฐ๋Šฅ

 max() ๋ฐฐ์—ด์˜ ์ตœ๋Œ€๊ฐ’ ๋ฐ˜ํ™˜
 min() ๋ฐฐ์—ด์˜ ์ตœ์†Œ๊ฐ’ ๋ฐ˜ํ™˜
 sort() ๋ฐฐ์—ด์„ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌ
 sort(by: >) ๋ฐฐ์—ด์„ ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌ
 isEmpty ๋ฐฐ์—ด์ด ๋น„์–ด์žˆ๋Š”์ง€ ํ™•์ธ
 elementsEqual(arr) ๋‹ค๋ฅธ ๋ฐฐ์—ด๊ณผ ๊ฐ™์€ ๋ฐฐ์—ด์ธ์ง€ ๋น„๊ต
 contains(n) ๋ฐฐ์—ด์— n์ด ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธ
 swapAt(a, b) ์ธ๋ฑ์Šค a์˜ ์š”์†Œ์™€ ์ธ๋ฑ์Šค b์˜ ์š”์†Œ๋ฅผ ๋ณ€๊ฒฝ

 

2. Dictionary

Dictionary์˜ ์ •์˜

  • ๋”•์…”๋„ˆ๋ฆฌ๋Š” ํ‚ค(Key) ์™€ ๊ฐ’(Value)์˜ ์Œ์œผ๋กœ ๊ตฌ์„ฑ๋˜๋Š” ์ˆœ์„œ๊ฐ€ ์—†๋Š” ์ž๋ฃŒ๊ตฌ์กฐ
  • ๋”•์…”๋„ˆ๋ฆฌ์—์„œ key๋Š” value๋ฅผ ๋Œ€๋ณ€ํ•˜๋Š” ์œ ์ผํ•œ ์‹๋ณ„์ž๊ฐ€ ๋จ
    • ๋”•์…”๋„ˆ๋ฆฌ ์•ˆ์—๋Š” ๊ฐ™์€ ์ด๋ฆ„์„ ๊ฐ€์ง„ key๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์Œ(์œ ์ผ์„ฑ)
    • ๋”•์…”๋„ˆ๋ฆฌ ์•ˆ์—์„œ value๋Š” ์œ ์ผํ•˜์ง€ ์•Š์Œ
  • ๊ฐ value๋Š” key๋กœ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅ
  • ๋”•์…”๋„ˆ๋ฆฌ ๋‚ด๋ถ€์— ์กด์žฌํ•˜์ง€ ์•Š๋Š” key๋กœ ์ ‘๊ทผํ•˜๊ฒŒ ๋˜๋ฉด nil ๊ฐ’์„ ๋ฐ˜ํ™˜

Dictionary์˜ ์„ ์–ธ

  • ๋Œ€๊ด„ํ˜ธ([]) ์•ˆ์— key์™€ value์˜ ์Œ๋“ค์„ ๋„ฃ์–ด ์ดˆ๊ธฐํ™”
/*
	var [๋”•์…”๋„ˆ๋ฆฌ ์ด๋ฆ„]:  Dictionary<ํ‚ค ํƒ€์ž…, ๊ฐ’ ํƒ€์ž…> = Dictionary<ํ‚ค ํƒ€์ž…, ๊ฐ’ ํƒ€์ž…>()
*/
// Dictionary ์„ ์–ธ
var anyDictionary: Dictionary<String, Int> = [String: Int]()
    
// ๋™์ผ ํ‘œํ˜„ - ๋ฆฌํ„ฐ๋Ÿด ์ด์šฉ
var anyDictionary: Dictionary<String, Any> = Dictionary<String, Any>()
var anyDictionary: Dictionary<String, Any> = [:]
var anyDictionary: [String: Any] = Dictionary<String, Any>()
var anyDictionary: [String: Any] = [String: Any]()

// ๋™์ผ ํ‘œํ˜„ - ๋นˆ ๋”•์…”๋„ˆ๋ฆฌ ์ƒ์„ฑ
var anyDictionary: [String: Any] = [:]
var anyDictionary = [String: Any]()

// ์ดˆ๊ธฐํ™”
var anyDictionary: [String: Int] = ["extramilejin": 28, "korea": 2021]

 

Dictionary์˜ value ์„ค์ •

  • ๋”•์…”๋„ˆ๋ฆฌ์˜ value์— ์ ‘๊ทผํ•˜๋Š” ๊ฐ€์žฅ ํ”ํ•œ ๋ฐฉ๋ฒ•์€ key๋ฅผ subscript๋กœ์จ ์‚ฌ์šฉ
  • ๋”•์…”๋„ˆ๋ฆฌ์—์„œ key์— ํ•ด๋‹นํ•˜๋Š” ๊ฐ’์ด ์—†์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ๋ฐ˜ํ™˜ ๊ฐ’์€ optional ์ธ์Šคํ„ด์Šค
    • subscript
    • ๋”๋ณด๊ธฐ
      ๋”๋ณด๊ธฐ
      - ์ปฌ๋ ‰์…˜, ๋ฆฌ์ŠคํŠธ, ์ง‘ํ•ฉ ๋“ฑ ํŠน์ • member elements์— ๊ฐ„๋‹จํ•˜๊ฒŒ ์ ‘๊ทผํ•˜๋Š” ๋ฌธ๋ฒ•
      - ๊ด„ํ˜ธ ์•ˆ์— index๋ฅผ ๋„ฃ์–ด member elements์— ์ ‘๊ทผ
      - ์ถ”๊ฐ€์ ์ธ ๋ฉ”์†Œ๋“œ ์—†์ด ํŠน์ • ๊ฐ’์„ ํ• ๋‹นํ•˜๊ฑฐ๋‚˜ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Œ
var responseMessages = [200: "OK",
                        403: "Access forbidden",
                        404: "File not found",
                        500: "Internal server error"]

print(responseMessages[200])
// Optional("OK")
  • if let ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋”•์…”๋„ˆ๋ฆฌ์—์„œ key์— ํ•ด๋‹นํ•˜๋Š” ๊ฐ’์˜ ์œ ๋ฌด์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ๋™์ž‘์„ ์ˆ˜ํ–‰
let httpResponseCodes = [200, 403, 301]
for code in httpResponseCodes {
		//key์— ํ•ด๋‹นํ•˜๋Š” ๊ฐ’ ์กด์žฌ
    if let message = responseMessages[code] {
        print("Response \\(code): \\(message)")
    } 

		//key์— ํ•ด๋‹นํ•˜๋Š” ๊ฐ’ ์—†์Œ
		else {
        print("Unknown response \\(code)")
    }
}
// Prints "Response 200: OK"
// Prints "Response 403: Access forbidden"
// Prints "Unknown response 301"

 

Dictionary ์ถ”๊ฐ€, ์‚ญ์ œ, ์ˆ˜์ •

  • subscripting์„ ์‚ฌ์šฉํ•˜์—ฌ key์™€ value๋ฅผ ์ถ”๊ฐ€, ์‚ญ์ œ, ์ˆ˜์ •์„ ํ•  ์ˆ˜ ์žˆ์Œ
    • ์ƒˆ๋กœ ์ถ”๊ฐ€ํ•˜๋Š” key-value pair์€ dictionary์— ์กด์žฌํ•˜์ง€ ์•Š๋Š” key-value๋กœ ์ถ”๊ฐ€ํ•ด์•ผํ•จ (ํ‚ค๋Š” ์œ ์ผ์„ฑ ๋ณด์žฅ)
  • key-value pair ์‚ญ์ œ๋Š” ์‚ญ์ œํ•˜๊ณ ์žํ•˜๋Š” key์— ํ•ด๋‹นํ•˜๋Š” value๋ฅผ nil๋กœ ์ˆ˜์ •ํ•˜๋ฉด ์˜๊ตฌ์ ์œผ๋กœ ์‚ญ์ œ๋จ
// add key-value pair
responseMessages[301] = "Moved permaently"
print(responseMessages[301])
// Prints Optional("Moved permaently")

// update key-value pair
responseMessages[301] = "Deleted permanently"
print(responseMessages[301])
// Prints Optional("Deleted permanently")

// remove key-value pair
responseMessages[500] = nil
print(responseMessages)
// Prints [200: "OK", 301: "Deleted permanently", 403: "Access forbidden", 404: "File not found"]

responseMessages.removeValue(forKey: 404)
responseMessages.removeAll()

 

Dictionary์˜ ํ”„๋กœํผํ‹ฐ์™€ ๋ฉ”์„œ๋“œ

  • isEmpty: ๋”•์…”๋„ˆ๋ฆฌ๊ฐ€ ๋น„์–ด์žˆ๋‹ค๋ฉด true, ๋น„์–ด์žˆ์ง€ ์•Š๋‹ค๋ฉด false ๋ฐ˜ํ™˜
  • count : ๋”•์…”๋„ˆ๋ฆฌ์˜ ์š”์†Œ์˜ ๊ฐœ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜
  • removeValue(forKey: ) : key์— ํ•ด๋‹นํ•˜๋Š” value๋ฅผ ์ฐพ์•„ ์ œ๊ฑฐํ•˜๊ณ  ๊ทธ ๊ฐ’์„ ๋ฐ˜ํ™˜
    • ๋งŒ์•ฝ ๋”•์…”๋„ˆ๋ฆฌ ์•ˆ์— key์— ํ•ด๋‹นํ•˜๋Š” value๊ฐ€ ์—†๋‹ค๋ฉด nil์„ ๋ฐ˜ํ™˜
    • ์ด ๊ฒฝ์šฐ ๊ธฐ๋ณธ๊ฐ’์„ ๋Œ๋ ค์ฃผ๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅ
  • keys: ๋”•์…”๋„ˆ๋ฆฌ ์•ˆ์— ์žˆ๋Š” ๋ชจ๋“  key๋ฅผ ๋ฐฐ์—ด๋กœ ๋ฐ˜ํ™˜
  • values: ๋”•์…”๋„ˆ๋ฆฌ ์•ˆ์— ์žˆ๋Š” ๋ชจ๋“  value๋ฅผ ๋ฐฐ์—ด๋กœ ๋ฐ˜ํ™˜
  • contains(where:): ๋”•์…”๋„ˆ๋ฆฌ์— ์š”์†Œ๊ฐ€ ์กด์žฌํ•˜๋ฉด true, ์•„๋‹ˆ๋ผ๋ฉด false ๋ฐ˜ํ™˜
  • firstIndex(where:): ๋”•์…”๋„ˆ๋ฆฌ์— ํ•ด๋‹น ์š”์†Œ์˜ ์ฒซ ๋ฒˆ์งธ ์ธ๋ฑ์Šค๋ฅผ optional๋กœ ๋ฐ˜ํ™˜
  • ๋”•์…”๋„ˆ๋ฆฌ์ด๋ฆ„ [ ํ‚ค ] = ๊ฐ’ : ๋”•์…”๋„ˆ๋ฆฌ์— ํ‚ค ์™€ ๊ฐ’์„ ์Œ์„ ์ถ”๊ฐ€
  • ๋”•์…”๋„ˆ๋ฆฌ์ด๋ฆ„ [ ํ‚ค ] = nil : ๋”•์…”๋„ˆ๋ฆฌ์—์„œ ํ‚ค์— ํ•ด๋‹นํ•˜๋Š” ๊ฐ’์„ nil๋กœ ํ• ๋‹นํ•˜์—ฌ ์ œ๊ฑฐ
var intDictionary: [String: Int] = ["extramilejin": 28, "korea": 2021]

print(intDictionary.isEmpty)                        // false
print(intDictionary.count)                          // 2
print(intDictionary.removeValue(forKey: "korea"))   // Optional(2021)
print(intDictionary.count)                          // 1
print(intDictionary.removeValue(forKey: "korea"))   // nil: ๊ฐ’์ด ์—†์Œ์„ ๋œปํ•œ๋‹ค.
print(intDictionary["korea", default: 0])           // 0: ๊ฐ’์ด ์—†์œผ๋ฉด ๊ธฐ๋ณธ๊ฐ’ 0

let countryCodes = ["BR": "Brazil", "GH": "Ghana", "JP": "Japan"]

print(countryCodes.keys) //["GH", "JP", "BR"]
print(countryCodes.values) //["Ghana", "Japan", "Brazil"]
print(countryCodes.contains(where: {$0.value == "Brazil"})) //true

 

 

Dictionary์˜ ๊ธฐ๋ณธ ๊ฐ’

  • ์กด์žฌํ•˜์ง€ ์•Š๋Š” key๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋”•์…”๋„ˆ๋ฆฌ์—์„œ value๋ฅผ ์ฝ์œผ๋ ค๊ณ ํ•˜๋ฉด  nil์„ ๋ฐ˜ํ™˜
  • ์กด์žฌํ•˜์ง€ ์•Š๋Š” key์— ๋Œ€ํ•œ value๋ฅผ ์š”์ฒญํ•˜๋Š” ๊ฒฝ์šฐ ๊ธฐ๋ณธ๊ฐ’์„ ๋ฏธ๋ฆฌ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ์Œ
  • ๋”•์…”๋„ˆ๋ฆฌ์—์„œ value์— ์ฆ๊ฐ ์—ฐ์‚ฐ(+= 1, -= 1 … )์„ ํ•˜๋Š” ๊ฒฝ์šฐ ์‚ฌ์šฉ
let favoriteIceCream = [ "์„œ๊ทผ": "์ดˆ์ฝœ๋ฆฟ", "ํฌ๋‡จ": "๋ฐ”๋‹๋ผ" ]
favoriteIceCream["์„œ๊ทผ"]
favoriteIceCream["ํ•˜์šธ"] // nil์ด ๋ฐ˜ํ™˜๋จ -> ์ด๋Š” ํ•ด๋‹น ํ‚ค์— ๋Œ€ํ•œ ๊ฐ’์ด ์—†์Œ์„ ์˜๋ฏธํ•จ

//๋”•์…”๋„ˆ๋ฆฌ์— "Unknown"์˜ **๊ธฐ๋ณธ๊ฐ’**์„ ์ง€์ •ํ•˜์—ฌ์ด nil์ด ๋ฐ˜ํ™˜๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€
favoriteIceCream["ํ•˜์šธ", default: "Unknown"]

Dictionary์˜ ๋ฐ˜๋ณต

  • ๋”•์…”๋„ˆ๋ฆฌ ๋‚ด๋ถ€๋ฅผ ์ˆœํšŒํ•˜๊ธฐ ์œ„ํ•ด, for-in loop๋ฅผ ์‚ฌ์šฉํ•ด, key-value ์Œ์„ ์–ป์–ด ์ˆœํšŒ
  • key-value์Œ์€ ํŠœํ”Œ ํ˜•ํƒœ๋กœ ๋ฐ˜ํ™˜
let imagePaths = ["star": "/glyphs/star.png",
                  "portrait": "/images/content/portrait.jpg",
                  "spacer": "/images/shared/spacer.gif"]

for (name, path) in imagePaths{
    print("The path to '\\(name)' is '\\(path)'.")
}
// The path to 'spacer' is '/images/shared/spacer.gif'.
// The path to 'star' is '/glyphs/star.png'.
// The path to 'portrait' is '/images/content/portrait.jpg'.

 

3. enum

enum์˜ ์ •์˜

  • ์—ด๊ฑฐํ˜•์€ ๊ด€๋ จ๋œ ๊ฐ’ ๋“ค์˜ ๊ทธ๋ฃน์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” ๋ฐ์ดํ„ฐ ํƒ€์ž…
  • ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ๊ณผ ์•ˆ์ „์„ฑ์„ ๋†’์—ฌ์คŒ
  • ๊ฐ๊ธฐ ๋‹ค๋ฅธ ์ƒํƒœ์™€ ๊ฐ๊ธฐ ๋‹ค๋ฅธ ํƒ€์ž…์˜ ์ž…๋ ฅ๊ฐ’์„ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ
enum Direction {
    case north
    case south
    case east
    case west
}
  • ๊ฐ case์— ๋Œ€ํ•œ ์ถ”๊ฐ€์ ์ธ ์ •๋ณด ๋ถ€์—ฌ ๊ฐ€๋Šฅ
enum HTTPResponse {
    case success(Int)
    case error(Int, String)
}

enum์˜ ์—ญํ•  ๋ฐ ํ•„์š”์„ฑ

  • ๊ฐ€๋…์„ฑ
    • ๊ด€๋ จ ๊ฐ’์— ์˜๋ฏธ ์žˆ๋Š” ์ด๋ฆ„์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ฝ”๋“œ๋ฅผ ๋” ์ฝ๊ธฐ ์‰ฝ๊ณ  ์‰ฝ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Œ
  • ์•ˆ์ „์„ฑ
    • ์„œ๋กœ ๋‹ค๋ฅธ ํƒ€์ž…์˜ ๊ฐ’์ด ์ž˜๋ชป ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋„๋กํ•จ์œผ๋กœ ํ˜• ์•ˆ์ „์„ฑ(type-safety)์„ ์ œ๊ณตํ•จ
    • ex- Monday ํƒ€์ž…์˜ ๊ฐ’์ด String ํƒ€์ž…์ด ์˜ˆ์ƒ๋˜๋Š” ๊ณณ์— ์ž˜๋ชป ์‚ฌ์šฉ๋˜์ง€ ์•Š๋„๋ก ํ•  ์ˆ˜ ์žˆ์Œ
  • ๋‹จ์ˆœํ™”
    • ์—ด๊ฑฐํ˜•์„ ์‚ฌ์šฉํ•˜๋ฉด ์ž‘์„ฑํ•ด์•ผ ํ•˜๋Š” ์ฝ”๋“œ์˜ ์–‘์„ ์ค„์ด๊ณ  ์ฝ”๋“œ๋ฅผ ๋ณด๋‹ค ๊ฐ„๊ฒฐํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Œ
    • ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ƒ์ˆ˜ ๋˜๋Š” ๋ณ€์ˆ˜ ์„ ์–ธ์„ ๋‹จ์ผ ์—ด๊ฑฐํ˜• ์„ ์–ธ์œผ๋กœ ๋Œ€์ฒด ํ•  ์ˆ˜ ์žˆ์Œ
  • ์กฐ์ง
    • ๊ด€๋ จ ๊ฐ’๋“ค์„ ์—ด๊ฑฐํ˜•์œผ๋กœ ๊ทธ๋ฃนํ™”ํ•˜๋ฉด ์ฝ”๋“œ๋ฅผ ๋ณด๋‹ค ํšจ์œจ์ ์œผ๋กœ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๊ณ  ์œ ์ง€ ๊ด€๋ฆฌ๋„ ์‰ฝ๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Œ
  • ๊ฐ’ ๋งค์นญ
    • Swift์˜ ์Šค์œ„์น˜ ๊ตฌ๋ฌธ์€ ์—ด๊ฑฐํ˜•๊ณผ์˜ ๊ฐ’ ๋งค์นญ์„ ์ง€์›ํ•˜๋ฏ€๋กœ ํŠน์ • ๊ฐ’์˜ ๋‹ค์–‘ํ•œ ์ผ€์ด์Šค๋ฅผ ์‰ฝ๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Œ
    • ๊ฐ€๋Šฅํ•œ ๋งŽ์€ ์ˆ˜์˜ ์‚ฌ๋ก€๋ฅผ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•  ๋•Œ ํŠนํžˆ ์œ ์šฉํ•  ์ˆ˜ ์žˆ์Œ
enum HTTPResponse {
    case success(Int)
    case error(Int, String)
}

let response = HTTPResponse.success(200)

switch response {
case .success(let statusCode):
    print("Success with status code \\(statusCode)")
case .error(let statusCode, let message):
    print("Error with status code \\(statusCode) and message \\(message)")
}

 

enum์˜ ์‚ฌ์šฉ๋ฒ•

enum Direction {
    case north
    case south
    case east
    case west
}

// To use an enum value, you simply reference its name:
let direction = Direction.north

switch direction {
case .north:
    print("Heading north")
case .south:
    print("Heading south")
case .east:
    print("Heading east")
case .west:
    print("Heading west")
}
  • enum ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ์—ด๊ฑฐํ˜• ์ •์˜
  • ์—ฌ๋Ÿฌ ์ผ€์ด์Šค๋ฅผ ์ฝค๋งˆ(,)๋กœ ๊ตฌ๋ถ„ํ•˜์—ฌ ํ•œ ์ค„์— ์ ์„ ์ˆ˜ ์žˆ์Œ
  • ์™„์ „ ์ƒˆ๋กœ์šด ํ˜• ์ •์˜ํ•ด์•ผ ํ•จ
    • Planet
    • ๋Œ€๋ฌธ์ž๋กœ ์‹œ์ž‘ํ•ด์•ผ ํ•จ
    enum Planet {
        case mercury, venus, earth, mars, jupiter, saturn, uranus, neptune
    } 
    
  • ํ˜•์ด ์ด๋ฏธ ํ•œ ๋ฒˆ ์ •์˜๋œ ๊ฒฝ์šฐ, ๋‹ค์Œ์— ๊ฐ’์„ ํ• ๋‹นํ•  ๋•Œ์—๋Š” ํ˜•์„ ์ƒ๋žตํ•œ ์ ๋ฌธ๋ฒ•(dot syntax)์„ ์ด์šฉํ•ด ๊ฐ’์„ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ์Œ
var whereToGo = Planet.earth
whereToGo = .mercury

 

4. Set

Set์˜ ์ •์˜

  • ๊ฐ™์€ ๋ฐ์ดํ„ฐ ํƒ€์ž…์˜ ๊ฐ’์„ ์ˆœ์„œ ์—†์ด ์ €์žฅํ•˜๋Š” ๋ฆฌ์ŠคํŠธ
  • ์ค‘๋ณต์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Œ
var setName: Set = Set<Int>()

 

Set์˜ ์‚ฌ์šฉ

count set์˜ ํ•ญ๋ชฉ์˜ ๊ฐœ์ˆ˜ ๋ฐ˜ํ™˜
isEmpty set์ด ๋น„์–ด์žˆ๋Š”์ง€ ํ™•์ธ
insert(value) set์— ๊ฐ’ ์ถ”๊ฐ€
remove(value) set์—์„œ ๊ฐ’ ์‚ญ์ œ
contains(value) set์— ๊ฐ’์ด ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธ
intersection(b) set b์™€ ๊ฐ™์€ ์š”์†Œ๋“ค๋งŒ ๋ฐ˜ํ™˜,  ๊ต์ง‘ํ•ฉ
union(b) set b์˜ ์š”์†Œ์™€ set์˜ ์š”์†Œ ๋ชจ๋‘ ๋ถ€๋ถ„ ๋ฐ˜ํ™˜, ํ•ฉ์ง‘ํ•ฉ
symmetricDifference(b) set b์˜ ์š”์†Œ์™€ set์˜ ์š”์†Œ์—์„œ ๊ฐ™์€ ์š”์†Œ๋งŒ ๋นผ๊ณ  ๋ฐ˜ํ™˜
subtracting(b) set์˜ ์š”์†Œ์—์„œ set b์™€ ๊ฐ™์€ ์š”์†Œ๋งŒ ๋นผ๊ณ  ๋ฐ˜ํ™˜
๋ฐ˜์‘ํ˜•