์์ํ๋ฉฐ
iOS ๊ฐ๋ฐ์ ์ํ ๋ค๋ฅธ ์ธํฐ๋ท ๊ฐ์๋ฅผ ๋ค์ผ๋ฉฐ ๊ธฐ์ด์ ์ธ ๋ฌธ๋ฒ์ ๋น ๋ฅด๊ฒ ์ตํ๊ณ ์๊ธด ํ์ง๋ง, swift์ ํน์ง์ ์จ์ ํ๊ฒ ์ ํ์ ํ๊ธฐ ์ํด์ ๊ณต์๋ฌธ์๋ฅผ ๊ผญ ๊ณต๋ถํ๊ณ , ์ ๋ฆฌํด๋ณด๋๋ก ํ์. ์ค๋์ ๊ทธ 4๋ฒ์งธ ์์, Collection types ์ด๋ค.
Swift ๊ณต์ Documents (4) Collection Types
Collection Types (์ปฌ๋ ์ ํ์ )
Swift๋ ์ปฌ๋ ์ ํ์ ์ผ๋ก Array(๋ฐฐ์ด), Set(์งํฉ), Dictionary(๋์ ๋๋ฆฌ) ์ ํ์ ์ ๊ณตํ๋ค. ๋ฐฐ์ด์ ๊ฐ์ด ์์๋๋ก ์ ๋ ฌ๋ ๋ชจ์์ด๊ณ , ์งํฉ์ ๊ณ ์ ์ ๊ฐ๋ค์ (์ค๋ณตํ์ง ์๋ค๋ ์๋ฏธ) ์ ๋ ฌ๋์ง ์๊ฒ (์์์์ด) ๋ชจ์๋์ ๋ชจ์์ด๊ณ , ๋์ ๋๋ฆฌ๋ Key์ Value๋ฅผ ์ฐ๊ฒฐํด๋์ ์ ๋ ฌ๋์ง ์์ ๋ชจ์์ด๋ค.
Swift์ ๋ฐฐ์ด, ๋์ ๋๋ฆฌ, ์งํฉ์ ์ ์ฅ๋๋ ๋ชจ๋ ๊ฐ๋ค์ ํญ์ ๋ช ํํ ํ์ ์ ๊ฐ์ง๊ณ ์์ด์ผ ํ๋ค. ๋ง์ฝ Int ์๋ฃํ์ ์ ์ฅํ๋ Array(๋ฐฐ์ด)์ String ํ์ ์ ๊ฐ์ง ๊ฐ์ ์ ์ฅํ๋ ค๊ณ ํ๋ฉด, ์ค๋ฅ๋ฅผ ๋ธ๋ค.
Mutability of Collections
๊ฐ๋ฐ์๊ฐ ๋ฐฐ์ด, ์งํฉ, ์ฌ์ ์ ๋ง๋ค์ด์ ๋ณ์์ ํ ๋นํ๋ฉด ๊ทธ ์ปฌ๋ ์ ์ ๋ณ๊ฒฝ ๊ฐ๋ฅํ๋ค. ์ฆ, ์ปฌ๋ ์ ์ ๊ฐ์ ์ถ๊ฐํ๊ณ , ์ ๊ฑฐ, ๋ณ๊ฒฝํ ์ ์๋ค๋ ๊ฒ์ด๋ค. ํ์ง๋ง ๊ฐ๋ฐ์๊ฐ ๋ฐฐ์ด, ์งํฉ, ์ฌ์ ์ ์์๋ก ์ ์ธ(let)ํ๋ฉด, ๊ทธ ์ปฌ๋ ์ ์ ํฌ๊ธฐ์ ๊ฐ ์ถ๊ฐ, ๊ฐ ๋ณ๊ฒฝ ๋ฑ ์ด๋ ํ ๋ณ๊ฒฝ๋ ๋ถ๊ฐ๋ฅํ๋ค.
Arrays (๋ฐฐ์ด)
๋ฐฐ์ด์ ๊ฐ์ type์ ๊ฐ๋ค์ ์ ๋ ฌ๋ ๋ฆฌ์คํธ์ ์ ์ฅํ๋ค. ๋์ผํ ๊ฐ์ด ๋ฐฐ์ด์ ์๋ก ๋ค๋ฅธ ์์น์ ์ฌ๋ฌ๋ฒ ๋ํ๋ ์ ์๋ค.
Array Type Shorthand Syntax
Swift์์ ๋ฐฐ์ด์ Array๋ก ํํํ ์ ์์ผ๋ฉฐ, Element์๋ ์ ์ฅํ ๊ฐ๋ค์ ํ์ ์ ์ฐ๋ฉด ๋๋ค. [element]๋ก ๋ฐฐ์ด์ ์์ฑํ ์๋ ์๋ค.
Creating an Empty Array
๊ฐ๋ฐ์๋ ์๋์ ๊ฐ์ ์์ฑ์ ๊ตฌ๋ฌธ์ ์ฌ์ฉํ์ฌ ํน์ ์ ํ์ ๋น ๋ฐฐ์ด์ ์์ฑํ ์ ์๋ค.
var someInts: [Int] = []
print("someInts is of type [Int] with \(someInts.count) items.")
// Prints "someInts is of type [Int] with 0 items."
๋ฐฐ์ด ๋ง๋๋ ๋ฐฉ๋ฒ โ โฒโฒโฒ
somInts ๋ฐฐ์ด์ ์ ํ์ Int ๋ก ์ง์ ํ์ฌ ์์ฑํ๋ค.
๋ํ ๊ฐ๋ฐ์๋ [] ๋น ๊ดํธ๋ฅผ ํ์ฉํ์ฌ ์ด๋ฏธ ๊ฐ์ด ๋ค์ด์๋ ๋ฐฐ์ด์ ๋น ๋ฐฐ์ด๋ก ๋ค์ ๋ง๋ค ์ ์๋ค. ํด๋น ๋ฐฐ์ด์ ์ด๋ฐ์ ์์ฑํ๋ Int ํ์ ์ ๊ฐ๋ ๋ฐฐ์ด์ด๋ผ๋ ์ ์ ์ ์ง๋๋ค.
someInts.append(3)
// someInts now contains 1 value of type Int
someInts = []
// someInts is now an empty array, but is still of type [Int]
Creating an Array with a Default Value
Swift์ Array ์ ํ์ ๋ชจ๋ ๊ฐ์ด ๋์ผํ ๊ฐ์ผ๋ก ์กด์ฌํ๊ฒ ๋ง๋๋ ์์ฑ์๋ฅผ ์ ๊ณตํ๋ค. ์์ฑ์์ repeating์๋ ํ ๊ฐ์ ๋์ผํ๊ฒ ๋ฃ์ ๊ฒ์ธ์ง, count์๋ ๋ช ๊ฐ์ ๊ฐ์ ์์ฑํ ๊ฒ์ธ์ง๋ฅผ ๋ช ์ํด์ฃผ๋ฉด ๋ฐฐ์ด์ด ์์ฑ๋๋ค.
์๋ ์ฝ๋๋ threeDoubles ๋ฐฐ์ด์ ์์ํ๋ ์ฝ๋์ด๊ณ , ๋ชจ๋ ๊ฐ์ด ๋ถ๋ ์์์ ํํ, ๊ทธ๋ฆฌ๊ณ ๋ฐฐ์ด์ ๊ธธ์ด๋ 3์ด ๋๋ค.
var threeDoubles = Array(repeating: 0.0, count: 3)
// threeDoubles is of type [Double], and equals [0.0, 0.0, 0.0]
Creating an Array by Adding Two Arrays Together (๋ฐฐ์ด ๋ํ๊ธฐ +)
์ฐ์ฐ์ + ๋ฅผ ์ฌ์ฉํ์ฌ ๋ ๊ฐ์ ๋ฐฐ์ด์ ํฉ์ณ ์ ๋ฐฐ์ด์ ์์ฑํ ์ ์๋ค. ๋ ๊ฐ์ Array๋ ๊ฐ์ ํ์ ์ Array์ฌ์ผ ํ๋ค.
var anotherThreeDoubles = Array(repeating: 2.5, count: 3)
// anotherThreeDoubles is of type [Double], and equals [2.5, 2.5, 2.5]
var sixDoubles = threeDoubles + anotherThreeDoubles
// sixDoubles is inferred as [Double], and equals [0.0, 0.0, 0.0, 2.5, 2.5, 2.5]
Creating an Array with an Array Literal (๋ฐฐ์ด ๋ฆฌํฐ๋ด์ ํ์ฉํ์ฌ ๋ฐฐ์ด ๋ง๋ค๊ธฐ)
๋ฐฐ์ด ๋ฆฌํฐ๋ด์ ์ฌ์ฉํด์ ๋ฐฐ์ด์ ์์ฑํ ์ ์๋ค. ์ด๊ธฐํ ์ํฌ ๊ฐ๋ค์ ํ์ ์ ์ ์ค์ํด์ผ ํ๋ค. ์๋ ์ฝ๋๋ Array ๋ฅผ ์์ฑํ๋ ๋๋ค๋ฅธ ๋ฐฉ๋ฒ์ด๋ค.
var shoppingList: [String] = ["Eggs", "Milk"]
// shoppingList has been initialized with two initial items
๋ฐฐ์ด ๋ง๋๋ ๋ฐฉ๋ฒ โก โฒโฒโฒ
์ด๋ ๊ฒ ๋ฐฐ์ด์ ์์ฑํ๊ธฐ๋ ํ์ง๋ง, swift๋ ํ์ ์ ์์จ์ค๋ ์ถ๋ก ํด์ ๋ฐฐ์ด์ ์์ฑํ ์ ์๋ค. ๋ฐ๋ผ์ ์ด๋ฐ swift์ ๊ธฐ๋ฅ ๋๋ถ์ ์ฐ๋ฆฌ๋ ๋ฐฐ์ด์ ์์ฑํ ๋ ํ์ ์ ๋ฐ๋ก ์์ฑํ์ง ์๊ณ ์๋์ ๊ฐ์ด ๊ฐ๋จํ๊ฒ ์ฝ๋๋ฅผ ๊ตฌํํ ์ ์๋ค.
var shoppingList = ["Eggs", "Milk"]
// ํ์
์ถ๋ก ๊ธฐ๋ฅ์ด ์์ด์ ์๋์ผ๋ก ํด๋น ๋ฐฐ์ด์ String ํ์
์ด๋ผ๊ณ ์ธ์ํ๋ค.
๋ฐฐ์ด ๋ง๋๋ ๋ฐฉ๋ฒ โข โฒโฒโฒ
Accessing and Modifying an Array (๋ฐฐ์ด์ ์ ๊ทผํ๊ณ ์์ ํ๋ ๋ฐฉ๋ฒ)
Array์ ๋ฉ์๋์ ํ๋กํผํฐ๋ฅผ ํ์ฉํ์ฌ ๋ฐฐ์ด์ ์ ๊ทผํ๊ฑฐ๋ ์์ ํ ์ ์๋ค.
โท Count
์ด์ฒ๋ผ array.count ๋ฅผ ํ์ฉํ๋ฉด ํด๋น ๋ฐฐ์ด์ ๊ธธ์ด๊ฐ ์ซ์ ํํ๋ก ์ถ๋ ฅ๋๋ค.
print("The shopping list contains \(shoppingList.count) items.")
// Prints "The shopping list contains 2 items."
โท isEmpty
Boolean isEmpty ํ๋กํผํฐ๋ฅผ ์ฌ์ฉํ์ฌ ์นด์ดํธ ์์ฑ์ด 0 ์ธ์ง ํ์ธํ ์ ์๋ค.
if shoppingList.isEmpty {
print("The shopping list is empty.")
} else {
print("The shopping list isn't empty.")
}
// Prints "The shopping list isn't empty."
โท append
append(_:) ๋ฉ์๋๋ฅผ ํตํด ์๋ก์ด ๊ฐ์ ์ถ๊ฐํ ์ ์๋ค.
shoppingList.append("Flour")
// shoppingList now contains 3 items, and someone is making pancakes
โท ์ฐ์ฐ์ +=๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐฐ์ด์ ๊ฐ ์ถ๊ฐํ๊ธฐ
์์์ ๋ฐฐ์ด๋ผ๋ฆฌ + ์ฐ์ฐ์๋ ์ฌ์ฉ ๊ฐ๋ฅํ๋ค๊ณ ํ๋๋ฐ, += ์ฐ์ฐ์ ๋ํ ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.
shoppingList += ["Baking Powder"]
// shoppingList now contains 4 items
shoppingList += ["Chocolate Spread", "Cheese", "Butter"]
// shoppingList now contains 7 items
โท ์ธ๋ฑ์ค ํ์ฉํ์ฌ ๋ฐฐ์ด์ ์ ๊ทผํ๊ธฐ
index๋ฅผ ํ์ฉํ์ฌ ๋ฐฐ์ด์ ์ ๊ทผ ๊ฐ๋ฅํ๋ค. 0๋ถํฐ ์์ํ๋ค.
var firstItem = shoppingList[0]
// firstItem is equal to "Eggs"
โท ์ธ๋ฑ์ค ํ์ฉํ์ฌ ๋ฐฐ์ด ๊ฐ ๋ฐ๊พธ๊ธฐ
index๋ฅผ ํ์ฉํ์ฌ ๋ฐฐ์ด์ ์ ๊ทผํ๊ณ , ํด๋น ์์น์ ์๋ ๊ฐ์ ๋ณ๊ฒฝํ ์ ์๋ค.
shoppingList[0] = "Six eggs"
// the first item in the list is now equal to "Six eggs" rather than "Eggs"
shoppingList[4...6] = ["Bananas", "Apples"]
// shoppingList now contains 6 items
// 4,5,6 ๋ฒ์๋ฆฌ์ ์๋ ๊ฐ์ ๋นผ๊ณ ์๋ก์ด ๋ ๊ฐ์ ๊ฐ์ ๋ฃ์๋ค. ๊ทธ๋ฌ๋ฏ๋ก ๊ธธ์ด๋ ์ค์ด๋ ๋ค.
โท insert ํ์ฉํ์ฌ ํน์ ์์น์ ๊ฐ ์ถ๊ฐํ๊ธฐ
insert(_:at:) ์ ํ์ฉํ๋ฉด ๋ฐฐ์ด์ ํน์ ์์น์ ์๋ก์ด ๊ฐ์ ์ถ๊ฐํ ์ ์๋ค. ์ฝ๋๋ ์๋์ ๊ฐ๋ค.
shoppingList.insert("Maple Syrup", at: 0)
// shoppingList now contains 7 items
// "Maple Syrup" is now the first item in the list
โท remove ํ์ฉํ์ฌ ํน์ ์์น์ ๊ฐ ์ ๊ฑฐํ๊ธฐ (remove, removeLast)
insert(_:at:) ์ ํ์ฉํ๋ฉด ๋ฐฐ์ด์ ํน์ ์์น์ ์๋ก์ด ๊ฐ์ ์ถ๊ฐํ ์ ์๋ค. ์ฝ๋๋ ์๋์ ๊ฐ๋ค.
let mapleSyrup = shoppingList.remove(at: 0)
// the item that was at index 0 has just been removed
// shoppingList now contains 6 items, and no Maple Syrup
// the mapleSyrup constant is now equal to the removed "Maple Syrup" string
// โ
โ
๋ฐฐ์ด์ ๋งจ ๋ง์ง๋ง ๊ฐ ์ญ์ ํ ๋ removeLast
let apples = shoppingList.removeLast()
// the last item in the array has just been removed
// shoppingList now contains 5 items, and no apples
// the apples constant is now equal to the removed "Apples" string
๋ง์ฝ insert ๋ remove ์ฒ๋ผ ํน์ ์ธ๋ฑ์ค๋ฅผ ์ง์ ํด์ ์์ ํ๋ ํ๋กํผํฐ์ ๊ฒฝ์ฐ ๋ฐฐ์ด์ ๋ฒ์๋ฅผ ๋ฒ์ด๋๋ ์ธ๋ฑ์ค๋ฅผ ์ง์ ํ๋ฉด ๋น์ฐํ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค.
Iterating Over an Array (for in ๊ตฌ๋ฌธ, enumerated)
for-in ๊ตฌ๋ฌธ์ ํ์ฉํ์ฌ ๋ฐฐ์ด์ ์ ๊ทผํ ์ ์๋ค.
for item in shoppingList {
print(item)
}
// Six eggs
// Milk
// Flour
// Baking Powder
// Bananas
๋ง์ฝ Array์ index๊ฐ ํ์ํ๋ค๋ฉด, enumerated() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด, index์ ๊ฐ์ ํจ๊ป ์ฌ์ฉํ ์ ์๋ค.
for (index, value) in shoppingList.enumerated() {
print("Item \(index + 1): \(value)")
}
// Item 1: Six eggs
// Item 2: Milk
// Item 3: Flour
// Item 4: Baking Powder
// Item 5: Bananas
Sets (์งํฉ)
Set์ ๋์ผํ ํ์ ์ ๊ฐ์ด ์์ ์์ด ์ ์ฅ๋ ์ปฌ๋ ์ ํ์ ์ด๋ค. Set์ ์ค๋ณต ๊ฐ์ ํ์ฉํ์ง ์๊ธฐ ๋๋ฌธ์ ์ด๋ฌํ ํน์ง์ ์ฌ์ฉํ๋ ๊ณณ์์๋ array๋์ set์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค.
Hash Values for Set Types (์งํฉ์ ํด์)
Set์ ์ ์ฅ๋๊ธฐ ์ํด์๋ hash๋ก ๋ง๋ค ์ ์์ด์ผ ํ๋ค. ์ฌ๊ธฐ์ ์ฌ์ฉ๋๋ ํด์๊ฐ์ intํ์ด๋ค. ์ฆ A์ B๊ฐ ์์ ๋, A์ ํด์ ๊ฐ๊ณผ B์ ํด์๊ฐ์ด ๊ฐ๋ค๋ฉด A์ B๋ ๊ฐ์ ๊ฐ์ด๋ผ๊ณ ๋ณผ ์ ์๋ค. ๋ชจ๋ Swift์ ๊ธฐ๋ณธ์ ์ธ ํ์ (Int, String, Double, Float, Bool)์ ํด์๊ฐ์ผ๋ก ์์ฑํ ์ ์๊ณ , ํด์๊ฐ์ set์ ๊ฐ์ด๋ Dictionary์ key๊ฐ์ด ๋ ์ ์๋ค.
Set type Syntax
set์ set์ผ๋ก ํํํ ์ ์๊ณ , element๋ set์ ์ ์ฅ๋ ์ ์๋ ๊ฐ๋ค์ ํ์ ์ด๋ค.
Creating and Initializing an Empty Set
๊ฐ๋ฐ์๋ ์์ฑ์ ๊ตฌ๋ฌธ์ ํ์ฉํ์ฌ ๋น ์งํฉ์ ์์ฑํ ์ ์๋ค.
var letters = Set<Character>()
print("letters is of type Set<Character> with \(letters.count) items.")
// Prints "letters is of type Set<Character> with 0 items."
๋ํ [] ๋น ๊ดํธ๋ฅผ ํ์ฉํ์ฌ set์ ์ด๊ธฐํํ ์ ์์ง๋ง, ์ด๋ฏธ ์ด๊ธฐ์ ์์ฑ๋ ํ์ ์ ๋ฐ๋์ง ์๋๋ค.
letters.insert("a")
// letters now contains 1 value of type Character
letters = []
// letters is now an empty set, but is still of type Set<Character>
Creating a Set with an Array Literal
Set์ ์ฒ์ ๋ง๋ค ๋ ํ๋ ์ด์์ ๋ฐฐ์ด ๋ฆฌํฐ๋ด์ ํ์ฉํ์ฌ ์งํฉ์ ๋ง๋ค ์ ์๋ค.
var favoriteGenres: Set<String> = ["Rock", "Classical", "Hip hop"]
// favoriteGenres has been initialized with three initial items
์งํฉ์ ๋ง๋๋ ๋ฐฉ๋ฒ โฒโฒโฒ
์งํฉ์ ์์ฑํ ๋๋ ๋ณ์(var), ์์(let)์ผ๋ก ์ ์ธํ๋๋์ ๋ฐ๋ผ ๊ฐ์ ์ถ๊ฐ ๋ฐ ๋ณํ์ด ๊ฐ๋ฅํ ์ ๋ฌด๊ฐ ๋ฌ๋ผ์ง๋ค. Set๋ ์ ์ฅ๋๋ ์๋ฃํ์ ๊ผญ ์จ์ฃผ์ง ์์๋ Swift๋ ์๋์ผ๋ก ํ์ ์ ์ ์ถํ๊ณ ์ถ๋ก ํ๋ค. ๋ฐ๋ผ์ ์๋์ ๊ฐ์ด ํ์ ๋ช ์ ์ญ์ ํ๊ณ Set์ ์์ฑํ ์๋ ์๋ค.
var favoriteGenres: Set = ["Rock", "Classical", "Hip hop"]
Accessing and Modifying a Set
Set์์๋ ์ฌ์ฉํ ์ ์๋ ๋ค์ํ ์์ฑ์์ ํ๋กํผํฐ๊ฐ ์กด์ฌํ๋ค. ์ฐจ๋ก๋๋ก ์ดํด๋ณด๊ฒ ๋ค.
โท count
Set์์ ๋ช ๊ฐ์ ๊ฐ์ด ์๋์ง ๋ณผ ์ ์๋ ํ๋กํผํฐ์ด๋ค.
print("I have \(favoriteGenres.count) favorite music genres.")
// Prints "I have 3 favorite music genres."
โท isEmpty
isEmpty๋ฅผ ํ์ฉํ์ฌ set ์์ ๊ฐ์ด 0๊ฐ ์ธ์ง ์๋์ง ํ์ธ ๊ฐ๋ฅํ๋ค.
if favoriteGenres.isEmpty {
print("As far as music goes, I'm not picky.")
} else {
print("I have particular music preferences.")
}
// Prints "I have particular music preferences."
โท insert(_:)
insert ๋ฉ์๋๋ฅผ ํ์ฉํ์ฌ set์์ ๊ฐ์ ์ถ๊ฐํ ์ ์๋ค.
(๋ฐฐ์ด์์๋ at์ ํ์ฉํ์ฌ ์ด๋ ์ธ๋ฑ์ค ์์น์ ๊ฐ์ ์ถ๊ฐํ ๊ฒ์ธ์ง ์์ฑํ์ง๋ง, ์งํฉ์ ์์๊ฐ ์๋ฏธ๊ฐ ์๊ธฐ ๋๋ฌธ์ ๊ทธ๋ฅ at์ ์ง์ ํ์ง ์๊ณ insertํ๋ค.)
favoriteGenres.insert("Jazz")
// favoriteGenres now contains 4 items
โท remove(_:)
remove ๋ฉ์๋๋ฅผ ํ์ฉํ์ฌ set์์ ๊ฐ์ ์ ๊ฑฐํ ์ ์๋ค. removeAll ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ฉด, ์งํฉ ๋ด์ ๋ชจ๋ ๊ฐ์ ์ ๊ฑฐํ ์ ์๋ค. removeํจ์๋ ์ญ์ ํ๋ ๊ฐ์ ๋ฐํํด์ฃผ๋ ๊ธฐ๋ฅ์ด ์๋ค.
if let removedGenre = favoriteGenres.remove("Rock") {
print("\(removedGenre)? I'm over it.")
} else {
print("I never much cared for that.")
}
// Prints "Rock? I'm over it."
โท contains(_:)
contains ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ set์ด๋ด์ ์ด๋ค ๊ฐ์ด ์กด์ฌํ๋์ง ํ์ธ ๊ฐ๋ฅ ํ๋ค.
if favoriteGenres.contains("Funk") {
print("I get up on the good foot.")
} else {
print("It's too funky in here.")
}
// Prints "It's too funky in here."
Iterating Over a Set
array์ ๋ง์ฐฌ๊ฐ์ง๋ก set๋ for in ๋ฃจํ๋ก ๋ฐ๋ณตํด์ ๋ชจ๋ ๊ฐ์ ์ถ๋ ฅ ๊ฐ๋ฅํ๋ค.
for genre in favoriteGenres {
print("\(genre)")
}
// Classical
// Jazz
// Hip hop
set์ ์์๊ฐ ์ ์๋์ด ์์ง ์์ง๋ง, sorted() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด, ์ฐ์ฐ์์ ์ํ ๋์ ๋น๊ต๋ก ๊ฐ๋ค์ ์ ๋ฆฌํ ์ ์๋ค.
for genre in favoriteGenres.sorted() {
print("\(genre)")
}
// Classical
// Hip hop
// Jazz
Performing Set Operations
Set์ ์งํฉ์ด๋ฏ๋ก, ์ฐจ์งํฉ, ๊ต์งํฉ, ํฉ์งํฉ ๋ฑ์ ๊ฐ๋ ์ ์ฌ์ฉํ ์ ์๋ค.
Fundamental Set Operations (๊ธฐ๋ณธ ์งํฉ ์ฐ์ฐ์)
์๋ ๊ทธ๋ฆผ์๋ ์์ ์์ญ์ผ๋ก ํํ๋๋ ๋ค์ํ ์งํฉ ์ฐ์ฐ์์ ๊ฒฐ๊ณผ๋ฅผ ๋ณผ ์ ์๋ค.
- intersection(_:) (๊ต์งํฉ) : ๋ ์งํฉ์ ๊ณตํต์ ์ธ ๊ฐ๋ง ์ฌ์ฉํ์ฌ ์ ์งํฉ์ ์์ฑํ๋ค.
- symmetricDifference(_:) : ๋ ์งํฉ์ ๊ต์งํฉ์ ์ ์ธํ ๋๋จธ์ง ๊ฐ๋ค์ ํ์ฉํ์ฌ ์งํฉ์ ์์ฑํ๋ค.
- union(_:) (ํฉ์งํฉ) : ๋ ์งํฉ์ ๋ชจ๋ ๊ฐ์ ํ์ฉํ์ฌ ์ ์งํฉ์ ์์ฑํ๋ค.
- substracting(_:) (์ฐจ์งํฉ) : ์ฐจ์งํฉ์ผ๋ก ์ง์ ๋ ์งํฉ์๋ ์๋ ๊ฐ๋ค์ ์ ๊ฑฐํ ์๋ก์ด ์งํฉ์ ์์ฑํ๋ค.
let oddDigits: Set = [1, 3, 5, 7, 9]
let evenDigits: Set = [0, 2, 4, 6, 8]
let singleDigitPrimeNumbers: Set = [2, 3, 5, 7]
oddDigits.union(evenDigits).sorted()
// [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
oddDigits.intersection(evenDigits).sorted()
// []
oddDigits.subtracting(singleDigitPrimeNumbers).sorted()
// [1, 9]
oddDigits.symmetricDifference(singleDigitPrimeNumbers).sorted()
// [1, 2, 9]
Set Membership and Equality
์๋์ ๊ทธ๋ฆผ์ ์ธ ์งํฉ(a, b, c)์ ๋ํ๋ด๋ฉฐ, ์งํฉ๋ค ๊ฐ์ ๊ณต์ ๋๋ ์์๋ค์ ๋ํ๋ด๋ ๊ฒน์น๋ ์์ญ๋ค์ ๋ณด์ฌ์ค๋ค. ์งํฉ a๋ b์ ๋ชจ๋ ์์๋ฅผ ํฌํจํ๋ฏ๋ก ์งํฉ a๋ ์งํฉ b์ ์์ ์งํฉ์ด๋ค. ๋ฐ๋๋ก, ์งํฉ b๋ ์งํฉ a์ ๋ถ๋ถ์งํฉ์ด๋ค. ์๋ํ๋ฉด b์ ๋ชจ๋ ์์๋ ๋ํ a์ ์ํด ํฌํจ๋๊ธฐ ๋๋ฌธ์ด๋ค. ์งํฉ b์ ์งํฉ c๋ ๊ณตํต์ ์ธ ์์๋ฅผ ๊ณต์ ํ์ง ์๊ธฐ ๋๋ฌธ์ ์๋ก ๋ถ๋ฆฌ๋๋ค.
- equal ์ฐ์ฐ์ (==) : ํด๋น ์ฐ์ฐ์๋ฅผ true๋ก ๋ฐํ์ํค๊ธฐ ์ํด์๋ ๋น๊ต๋๋ ๋ set์ ๋ชจ๋ ์์๊ฐ ๊ฐ์์ผ ํ๋ค.
- isSubset(of:) ๋ฉ์๋ : ํด๋น ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด ์ด๋ค set์ ๋ชจ๋ ์์๋ฅผ ํน์ set์ด ๊ฐ๊ณ ์๋์ง ํ์ธํด์ค๋ค.
- isSuperset(of:) ๋ฉ์๋ : ๋ฐ๋๋ก ์ด๋ ํ set์ด ํน์ set์ ์์๋ฅผ ๋ชจ๋ ๊ฐ์ง๊ณ ์๋์ง ํ์ธํด์ค๋ค.
- isStrictSubset(of:) ํน์ isStrictSuperset(of:) : ๋ง์ฝ ์ด๋ค set์ด ํน์ set์ subset์ธ์ง, superset์ธ๋ฉด์ ๊ฐ์ set์ ์๋์ง๋ฅผ ํ์ธํด์ค๋ค.
- isDisjoint(with:) : ๋ set์ด ๊ณตํต์ ์ผ๋ก ๊ฐ์ง ์์๊ฐ ํ๋๋ ์๋ ๊ฒ์ ํ์ธํด์ค๋ค.
let houseAnimals: Set = ["๐ถ", "๐ฑ"]
let farmAnimals: Set = ["๐ฎ", "๐", "๐", "๐ถ", "๐ฑ"]
let cityAnimals: Set = ["๐ฆ", "๐ญ"]
houseAnimals.isSubset(of: farmAnimals)
// true
farmAnimals.isSuperset(of: houseAnimals)
// true
farmAnimals.isDisjoint(with: cityAnimals)
// true
์ถ๊ฐ์ค๋ช ) superset๊ณผ subset์ ๊ฐ๋ ์ ๋ถ๋ชจ์ ์์ ๊ด๊ณ๋ผ๊ณ ์๊ฐํ๋ฉด๋๋ค. farAnimals๋ houseAnimals์ ์์๋ฅผ ๋ชจ๋ ํฌํจํ๊ณ ์๊ธฐ ๋๋ฌธ์ farmAnimals๊ฐ houseAnimals์ ๋ถ๋ชจ(superset)๊ฐ ๋๊ณ ์๊ฐํ๋ฉด ๋๋ค.
Dictionaries(๋์ ๋๋ฆฌ)
Dictionary๋ ket๊ฐ๊ณผ value๊ฐ์ ์์ด ์์ ์์ด ์ด๋ฃจ์ด์ง ์ปฌ๋ ์ ํ์ ์ด๋ค. ๋ชจ๋ ๊ฐ๋ค์ ์ ์ผํ ํค๊ฐ์ ๊ฐ์ง๊ณ ์์ด์ผ ํ๋ค.
Dictionary type Shorthand Syntax
Dictionary๋ Dictinary<Key, Value> ๋ก ํํํ๋ค. key์๋ key๊ฐ์ ํ์ , value์๋ value ๊ฐ์ ํ์ ์ ์จ ์ฃผ๋ฉด ๋๋ค. dictionary๋ฅผ [Key: Value] ๋ก ํํํ ์๋ ์๋ค. ๋ ๊ฐ์ ํํ๋ฐฉ์์ด ์์ง๋ง ๊ฐ์ ์๋ฏธ๋ฅผ ๊ฐ๋๋ค.
Creating an Empty Dictionary (๋์ ๋๋ฆฌ ์์ฑํ๊ธฐ!)
๋น dictionary๋ฅผ ์์ฑํ๊ธฐ ์ํด์๋ ์์ฑ์๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
var namesOfIntegers: [Int: String] = [:]
// namesOfIntegers is an empty [Int: String] dictionary
๋์ ๋๋ฆฌ ๋ง๋๋ ๋ฐฉ๋ฒ โ โฒโฒโฒ
dictionary๋ ๋ง์ฐฌ๊ฐ์ง๋ก ํ ๋ฒ ์ ์ธ ๋์์ผ๋ฉด, ๋น์ด์๋ dictionary๋ก ์ด๊ธฐํ ๋์๋ค๊ณ ํด๋ ์ด๊ธฐ์ ์ค์ ํ ๊ทธ ํ์ ์ ๋ฐ๋์ง ์๊ณ ์ ์ง๋๋ค. [:] ๋ฅผ ํ์ฉํ์ฌ ๋น ๋์ ๋๋ฆฌ๋ก ์ด๊ธฐํ ์ํฌ ์ ์๋ค.
์ฐธ๊ณ ) ๊ฐ์ ์ถ๊ฐํ ๋๋ dicName[Key] = 'Value' ๋ก ์ถ๊ฐํ ์ ์๋ค.
namesOfIntegers[16] = "sixteen"
// namesOfIntegers now contains 1 key-value pair
namesOfIntegers = [:]
// namesOfIntegers is once again an empty dictionary of type [Int: String]
Creating a Dictionary with a Dictionary Literal
dictionary literal๋ก๋ ๋์ ๋๋ฆฌ๋ฅผ ์์ฑํ ์ ์๋ค. key:value ํ์์ผ๋ก ํ๋์ key-value๋ฅผ ์์ฑํ๊ณ , ์ฝค๋ง(,)๋ก ๊ตฌ๋ถํ์ฌ ์์ฑํ๋ฉด ๋๋ค. ์๋์ ๊ฐ์ด ํ๋ฉด ๋ ๊ฐ์ key-value์์ ๊ฐ์ง ๋์ ๋๋ฆฌ๊ฐ ์์ฑ๋๋ค. ๋์ ๋๋ฆฌ๋ ์์์ ๋ฐฐ์ด ๊ฒ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ํ์ ์ ํ์ ์์ฑํ์ง ์์๋ swift๋ ์๋์ผ๋ก ์ ์ถ, ์ถ๋ก ํ์ฌ ํ์ ์ ์ง์ ํ ์ ์๋ค.
// ํ์
์ ์ด์ ๋์
๋๋ฆฌ ์์ฑํ๊ธฐ
var airports: [String: String] = ["YYZ": "Toronto Pearson", "DUB": "Dublin"]
//ํ์
์์ด ๊ฐ๋จํ๊ฒ ๋์
๋๋ฆฌ ์์ฑํ๊ธฐ
var airports = ["YYZ": "Toronto Pearson", "DUB": "Dublin"]
Accessing and Modifying a Dictionary (๋์ ๋๋ฆฌ์ ์ ๊ทผํ๊ณ ์์ ํ๋ ๋ฐฉ๋ฒ)
๋์ ๋๋ฆฌ๋ ์์์ ๋ฐฐ์ด ๋ฐฐ์ด, ์งํฉ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ๋ค์ํ ํ๋กํผํฐ์ ๋ฉ์๋๋ฅผ ๊ฐ์ง๊ณ ์๋ค. ํด๋น ๋ฉ์๋, ํ๋กํผํฐ๋ฅผ ์ฌ์ฉํ์ฌ ๋์ ๋๋ฆฌ์ ์ ๊ทผํ๊ณ ์์ ๊ฐ๋ฅํ๋ค.
โท count
count ๋ฉ์๋๋ dictionary๊ฐ ๊ฐ๊ณ ์๋ key-value ์์ ๊ฐ์๋ฅผ ๋ณด์ฌ์ค๋ค.
print("The airports dictionary contains \(airports.count) items.")
// Prints "The airports dictionary contains 2 items."
โท isEmpty
isEmpty ํ๋กํผํฐ๋ฅผ ์ฌ์ฉํ์ฌ ๋์
๋๋ฆฌ๊ฐ ๋น์ด์๋์ง ํ์ธ ํ ์ ์๋ค.
if airports.isEmpty {
print("The airports dictionary is empty.")
} else {
print("The airports dictionary isn't empty.")
}
// Prints "The airports dictionary isn't empty."
โท ๋์
๋๋ฆฌ์ ๊ฐ ์ถ๊ฐํ๊ธฐ
์๋์ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก ๋์
๋๋ฆฌ์ ๊ฐ์ ์ถ๊ฐํ ์ ์๋ค.
airports["LHR"] = "London"
// the airports dictionary now contains 3 items
โท ๋์
๋๋ฆฌ์ value๊ฐ ๋ณ๊ฒฝํ๊ธฐ (๋ ๊ฐ์ง ๋ฐฉ๋ฒ~)
๋์
๋๋ฆฌ์ ๊ฐ์ ์ถ๊ฐํ๋ ๋ฐฉ์๊ณผ ๋์ผํ ๋ฐฉ์์ผ๋ก ๊ฐ์ ๋ณ๊ฒฝํ ์ ์๋ค. key๊ฐ์ ์ค๋ณต๋์ง ์๊ธฐ ๋๋ฌธ์ ์๋ก์ด key๊ฐ์ ๊ฐ์ง ๊ฒฝ์ฐ ์ถ๊ฐ๋๋ ๊ฒ์ด๊ณ , ๊ธฐ์กด์ key๊ฐ์ ๋ถ๋ฅด๊ฒ ๋๋ฉด ํด๋น key๊ฐ์ value๋ฅผ ์์ ํ๊ฒ ๋๋ค.
airports["LHR"] = "London Heathrow"
// the value for "LHR" has been changed to "London Heathrow"
ํด๋น ๋ฐฉ๋ฒ ๋ง๊ณ updateValue(_:forKey:) ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ ์์ ํ ์๋ ์๋ค. ๋ง์ฝ ์ด ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ๋ ์๋ key์ ๋ํด์ ์์ ํ๋ ค๊ณ ํ๋ฉด, ์์ ์ด ์๋ ์์ฑ์ ํ๊ฒ ๋๋ค. (์์ ๋์ผ!)
updateValue() ๋ฉ์๋๋ ๊ธฐ์กด์ value๊ฐ์ ๋ฐํํด์ค๋ค. ์ด๋ ๋ฐํ๋๋ ๊ฐ์ ์ต์ ๋ ๊ฐ์ผ๋ก ๋ฐํ๋๋ค. ์ฆ, ๋ง์ฝ String ๊ฐ์ ์ ์ฅํด๋๋ค๋ฉด, Sprint? ํน์ optional(String)๊ฐ์ ๋ฐํํ๋ค. ๋ง์ฝ ์๋ key๊ฐ์ value๊ฐ์ ๋ณ๊ฒฝํ๋ ค๊ณ ํ๋ค๋ฉด nil๊ฐ์ ๋ฐํํ๊ฒ ๋๋ค.
if let oldValue = airports.updateValue("Dublin Airport", forKey: "DUB") {
print("The old value for DUB was \(oldValue).")
}
// Prints "The old value for DUB was Dublin."
Dictionary์์ ํน์ ํ key๊ฐ์ ์ ๊ทผํ ๋ key๊ฐ์ด ์กด์ฌํ์ง ์์ ์ ์๊ธฐ ๋๋ฌธ์ ์ต์ ๋ ๊ฐ์ผ๋ก ๊ฒฐ๊ณผ๋ฅผ ์ค๋ค. (์ต์ ๋ ๊ฐ๋ง์ด nil์ ๊ฐ์ง ์ ์๋ค.) ์ฆ ์กด์ฌํ์ง ์๋ key๊ฐ์ ์ ๊ทผํ๋ฉด nil ์ ๋ฐํ์์ผ์ค๋ค. ์ด๋ ๊ธฐ ๋๋ฌธ์ ์ต์ ๋ ๋ฐ์ธ๋ฉ์ ํ์ฉํด์ value ๊ฐ์ ์ถ์ถํด์ค์ผ ํ๋ค. (์ฐธ๊ณ : Swift ๊ณต์ ๋ฌธ์ ์ ๋ฆฌ (1) - The Basics)
if let airportName = airports["DUB"] {
print("The name of the airport is \(airportName).")
} else {
print("That airport isn't in the airports dictionary.")
}
// Prints "The name of the airport is Dublin Airport."
โท ๋์
๋๋ฆฌ์ key-value ์ ์ญ์ ํ๊ธฐ (nil, removeValue)
๋์
๋๋ฆฌ์์ key-value ์์ ์ญ์ ํ๊ธฐ ์ํ ๋ฐฉ๋ฒ์ ๋๊ฐ์ง๊ฐ ์๋ค.
์๋ ์ฝ๋๋ ์ฒซ๋ฒ์งธ๋ก, ์ด๋ฏธ ์กด์ฌํ๊ณ ์๋ key๊ฐ์ value๋ฅผ nil๋ก ์ง์ ํด์ฃผ๋ ๋ฐฉ๋ฒ์ด๋ค.
airports["APL"] = "Apple International"
// "Apple International" isn't the real airport for APL, so delete it
airports["APL"] = nil
// APL has now been removed from the dictionary
์ด๋ฐ ๋ฐฉ๋ฒ ๋ง๊ณ ๋๋ฒ ์งธ๋ก, removeValue(forKey:)๋ฅผ ์ฌ์ฉํ์ฌ ์ ๊ฑฐํ ์๋ ์๋ค. removeValue(forKey:) ํจ์๋ ์ญ์ ๋ ๊ฐ์ ๋ฐํํด์ฃผ๋๋ฐ, ๋ฌผ๋ก ์กด์ฌํ์ง ์๋ key-value ์์ ๋ํด์ ์ญ์ ํ๋ ค๊ณ ํ๋ฉด nil์ ๋ฐํํ๋ค.
if let removedValue = airports.removeValue(forKey: "DUB") {
print("The removed airport's name is \(removedValue).")
} else {
print("The airports dictionary doesn't contain a value for DUB.")
}
// Prints "The removed airport's name is Dublin Airport."
Iterating Over a Dictionary
๋์ ๋๋ฆฌ๋ ๋ง์ฐฌ๊ฐ์ง๋ก, for-in ๋ฃจํ๋ฅผ ์ฌ์ฉํ์ฌ ๋ชจ๋ ๊ฐ์ ์ถ๋ ฅํ ์ ์๋ค. key์ value ๋๊ฐ์ ๊ฐ์ ์ ๊ทผํด์ผ ํ๊ธฐ ๋๋ฌธ์ (key, value) ํํ์ ํํ๋ก ๋ฐํ๋๋ค.
for (airportCode, airportName) in airports {
print("\(airportCode): \(airportName)")
}
// LHR: London Heathrow
// YYZ: Toronto Pearson
๋ฌผ๋ก ํํ ํํ๋ก key, value ๋๊ฐ์ ๊ฐ์ ๋ฐํํ๊ณ ์ถ์ง ์๋ค๋ฉด, ๋์ ๋๋ฆฌ์ keys, values ํ๋กํผํฐ๋ฅผ ํ์ฉํ์ฌ ๊ฐ๊ฐ์ ์ ๊ทผํ๊ณ ๋ฐํํ๊ฒ ๋ง๋ค ์ ์๋ค. (๋์ ๋๋ฆฌ key ๋ฐํํ๊ธฐ, value๋ฐํํ๊ธฐ!)
for airportCode in airports.keys {
print("Airport code: \(airportCode)")
}
// Airport code: LHR
// Airport code: YYZ
for airportName in airports.values {
print("Airport name: \(airportName)")
}
// Airport name: London Heathrow
// Airport name: Toronto Pearson
keys, values ํ๋กํผํฐ๋ฅผ ํ์ฉํ์ฌ ๋ฐฐ์ด๋ก๋ ์์ฑ ๊ฐ๋ฅํ๋ค.
let airportCodes = [String](airports.keys)
// airportCodes is ["LHR", "YYZ"]
let airportNames = [String](airports.values)
// airportNames is ["London Heathrow", "Toronto Pearson"]
์ ๊ทธ๋ฆฌ๊ณ ๋ง์ง๋ง์ผ๋ก, ๋์ ๋๋ฆฌ ๋ํ ์งํฉ์ฒ๋ผ ์์๊ฐ ์์ด ์ ์ฅ๋๋ ์ปฌ๋ ์ ํ์ ์ด๋ฏ๋ก, sorted() ๋ฅผ ํ์ฉํ์ฌ ๋์ ๋๋ฆฌ ๋ด ์ ๋ ฌ์ด ๊ฐ๋ฅํ๋ค.
๋ง๋ฌด๋ฆฌ
์ด๋ฏธ ์์ฑ๊ฐ์๋ก ๋ฌธ๋ฒ์ ๋ค ๋ฐฐ์ ์ง๋ง ์ด๋ ๊ฒ ํ๋์ฉ ์ง์ด์ ๋ค์ ๊ณต๋ถํด๋ณด๋ ์๋ค๋ฅธ ๋๋์ด๋ค. ๋ ์ ํํ๊ณ ๋ช ํํ ์ดํด๋ฅผ ์ํด ์ง๋ฃจํ๋๋ผ๋ ๊พธ์คํ ๊ณต์๋ฌธ์๋ฅผ ํ๋์ฉ ์ ๋ฆฌํด๋๊ฐ๋ณด๊ฒ ๋ค. ๋ด๊ฐ ์ํ๋ ์ฑ์ ์์ ์์ฌ๋ก ๋ง๋ค ์ ์์ ๋๊น์ง ํ์ดํ !