μλ νμΈμ! μ΄λ² ν¬μ€ν μ Swift λ°μ΄ν°κ΅¬μ‘°μ μκ³ λ¦¬μ¦ μ± μ 2μ₯ μ€ν°λ μ€ λλ²μ§Έ ν΅μ¬ λ΄μ©μΈ Collection Type μ λν λ΄μ©μ λλ€. Array (λ°°μ΄), Dictionary (λμ λ리, μ¬μ ν), Set (μ§ν©), Tuple(νν) λ€κ°μ§ νμ μ λν΄ νμ΅νμ΅λλ€.
π‘ μ§ν©(Set)
Set μ μλ‘ μ€λ³΅λμ§ μκ³ , nil μ΄ ν¬ν¨λμ§ μμ μμκ° μλ 컬λ μ μ λλ€. Set λ μνμμμ μ§ν©μ κ°λ μ κΈ°λ°μΌλ‘ λ§λ λ°μ΄ν° νμ μ΄λΌκ³ ν©λλ€. Set μ λ°μ΄ν°λ Dictionaryμ Key μ λ§μ°¬κ°μ§λ‘ Hashable νλ‘ν μ½μ λΆν©ν΄μΌ ν©λλ€! κΈ°λ³Έ λ°μ΄ν° νμ μΈμ 컀μ€ν νμ λ μ§μ ν μ μμ§λ§, μ΄ κ²½μ° Hashable νλ‘ν μ½μ λΆν©νλλ‘ λ§λ€μ΄μΌ ν©λλ€.
Set μ λ°°μ΄λ³΄λ€ ν¨μ¨μ μ΄κ³ , λ°μ΄ν° μ κ·Ό μλκ° λΉ λ₯΄λ€κ³ ν©λλ€. Hashable νλ‘ν μ½μ μ€μνκΈ° λλ¬Έμ΄ μλκΉμ? πΆ!! λ°°μ΄μ ν¬κΈ°κ° n μΌ λ, λ°°μ΄ μμ κ²μ μ μ΅μ μ μκ°λ³΅μ‘λλ O(n) μ΄μ§λ§ Set μ κ²½μ° ν¬κΈ°μ μκ΄μμ΄ O(1) μ μ μ§νλ€κ³ ν©λλ€. κ·Έλ¬λ―λ‘ λ°°μ΄μμ μμμ μμκ° μ€μνμ§ μκ³ , ν λ²λ§ λνλλ λλ κ²½μ°, Array λμ Set μ μ΄μ©νλ κ²μ΄ ν¨μ¨μ μ λλ€!
βοΈ Set μ΄κΈ°ν
- λΉμ΄μλ Set μ΄κΈ°ν μ, λ°°μ΄κ³Ό νΌλλμ§ μκΈ° μν΄ μΆμ½νμ μ 곡νμ§ μλλ€κ³ ν©λλ€! Set νμ μμ λͺ μν΄μΌ ν©λλ€.
- λ°°μ΄ μμλ‘ Set μ΄κΈ°ν μ, Set μ μμ νμ μ μλ΅ν μ μμ΅λλ€.
// Creates an empty set
var stringSet = Set<String>()
// Creating a Set with an Array Literal
var stringSet1: Set<String> = ["A", "B", "C"]
var stringSet2: Set = ["A", "B", "C"]
βοΈ Set μμ μΆκ°, μμκ° μλμ§ νμΈ
- insert(_:) λ©μλλ‘ μλ‘μ΄ μμλ₯Ό μΆκ°ν μ μλ€.
- λ©μλ λ°νκ°μ (inserted, memberAfterInsert)
- inserted :: Set μ μλ‘μ΄ μμκ° μΆκ°λμλμ§μ λν Bool νμ - true / false
- memberAfterInsert :: μΆκ°νλ €λ κ°. μλ‘ μΆκ°λ κ²½μ° μλ‘κ² μΆκ°λ κ° / μΆκ°λμ§ μμλ€λ©΄ κΈ°μ‘΄ κ°
- contains(_:) λ©μλλ‘ νΉμ μμκ° Set μ ν¬ν¨λμ΄μλμ§ μ μ μλ€. λ°νκ°μ Bool νμ
stringSet.insert("A")
// (inserted: true, memberAfterInsert: "A")
stringSet.insert("A")
// (inserted: false, memberAfterInsert: "A")
stringSet.contains("B")
// false
βοΈ Set μμ μμ
- remove(_:) λ©μλλ νΉμ μμλ₯Ό μμ νλ€.
- νΉμ μμμ κ°μ 미리 μκ³ μμ΄μΌ νλ€.
- νΉμ μμκ° μλ€λ©΄ κ·Έ κ°μ 리ν΄, μλ€λ©΄ nil μ 리ν΄νλ€.
- remove(at:) λ©μλλ νΉμ μΈλ±μ€μ μμλ₯Ό μμ νλ€.
- μ΄λ μΈλ±μ€λ λ°°μ΄μμμ Int κ° μλ Set.Index κ°μ΄λ€.
- firstIndex(of:) λ©μλ λ±κ³Ό ν¨κ» μ¬μ©ν μ μλ€.
- removeFirst() λ©μλλ Set μ 첫λ²μ§Έ μμλ₯Ό μμ νλ€.
- Set μ μμκ° μ§μ λμ§ μμ 컬λ μ
μ΄λ―λ‘, μ΄κΈ°νμ λ°°μ΄μ 첫λ²μ§Έ μμμ λ€λ₯Ό μ μλ€.
- Set μ μμκ° μ§μ λμ§ μμ 컬λ μ
μ΄λ―λ‘, μ΄κΈ°νμ λ°°μ΄μ 첫λ²μ§Έ μμμ λ€λ₯Ό μ μλ€.
- removeAll(), removeAll(keepCapacity:) λ©μλλ μ 체 μμλ₯Ό μμ νλ€.
- keepCapacity λ bool νμ μ κ°μΌλ‘, true μΈ κ²½μ° Set μ μ©λ(capacity)μ κ°μνμ§ μλλ€.
- removeAll() λ©μλλ₯Ό μ μΈνκ³ λ capacity κ° κ°μνμ§ μμλ€.
var stringSet1: Set<String> = ["A", "B", "C", "D"]
// {"A", "D", "B", "C"}
// νΉμ μμ μμ
stringSet1.remove("A")
// νΉμ μΈλ±μ€μ μμ μμ
if let idx = stringSet1.firstIndex(of: "C") {
stringSet1.remove(at: idx)
}
// Set μ 첫λ²μ§Έ μμ μμ
stringSet1.removeFirst() // "D" κ° μμ λλ€.
// Set μ λͺ¨λ μμ μμ
stringSet1.capacity // 6 :: 4 + 2(μ¬μ 곡κ°)
stringSet1.removeAll(keepingCapacity: true)
stringSet1.capacity // 6μΌλ‘ ν¨μ νΈμΆμ κ³Ό κ°λ€.
βοΈ Set μμ μ λ ¬ν΄μ λ°λ³΅νκΈ°
- for ... in λ¬Έλ²μΌλ‘ Set μ μμλ₯Ό μνν μ μλ€. μ΄λ μ§μ λ μμλ μλ€.
- Set.sorted() λ©μλ νΈμΆλ‘ Setμ μ€λ¦μ°¨μμΌλ‘ μ λ ¬ν μ μλ€. μ λ ¬λ λ°°μ΄μ΄ λ°νλλ€.
- Set.sorted(by: {$0 > $1 }) λ©μλ νΈμΆλ‘ Set μ λ΄λ¦Όμ°¨μμΌλ‘ μ λ ¬ν μ μλ€. μ λ ¬λ λ°°μ΄μ΄ λ°νλλ€.
var nameSet: Set<String> = ["Sally", "Mary", "Michael", "Brown"]
// Set μμ λ°λ³΅λ¬ΈμΌλ‘ μννκΈ°
// Michael - Brown -Sally - Mary μμλ‘ μνλμλ€.
for name in nameSet {
print(name)
}
// Set μμ μ λ ¬ν΄μ λ°λ³΅ μννκΈ°
// Brown - Mary - Michael - Sally μΌλ‘ μνλ²³ μ¬μ μμΌλ‘ μ λ ¬λλ€.
for name in nameSet.sorted() {
print(name)
}
// Set μμ λ΄λ¦Όμ°¨μμΌλ‘ μ λ ¬νκΈ°
// ["Sally", "Michael", "Mary", "Brown"]
nameSet.sorted(by: { $0 > $1 }))
π‘ Set μ§ν© μ°μ° ν¨μ μ΄μ©νκΈ°
Set μ μνμμμ μ§ν© κ°λ μ κΈ°λ°μΌλ‘ λ§λ νμ μΌλ‘, μ§ν© ꡬ쑰λ μ°μ°μ΄ νμν λ μ μ©νλ©΄ μ’μ νμ μ λλ€. λ μ§ν©κ° μ°μ°μ μν΄ ν©μ§ν©, κ΅μ§ν©, μ¬μ§ν©, μ°¨μ§ν© λ©μλλ₯Ό μ 곡ν©λλ€. κ° μ°μ°λ§λ€ μλ‘μ΄ Set μ λ§λ€μ΄ λ°ννλ λ©μλ, μλ³Έ Set μ μ λ°μ΄νΈ νλ λ©μλ μ΄λ κ² λ κ°κ° μ‘΄μ¬ν΄μ! λ©μλμ μΈμλ Array, Set λͺ¨λ κ°λ₯ν©λλ€.
- Set μ λλ±μ°μ° (==) λ λ΄λΆ μμκ° κ°μΌλ©΄ λλ±νλ€κ³ νλ¨ν©λλ€. μμκ° μκΈ° λλ¬Έμ μμλ§ λΉκ΅νλ κ²μ
λλ€.
- ν©μ§ν© (A∪B) :: λ μ§ν©μ μλ μμλ₯Ό λͺ¨λ ν¬ν¨μν¨λ€.
- union(_:) λ©μλλ λ Set μ ν©μ§ν©μΌλ‘ μλ‘μ΄ Set μ λ§λ€μ΄ λ°ννλ€.
- formUnion(_:) λ©μλλ λ Set μ ν©μ§ν©μΌλ‘ μλ³Έ Set μ μ λ°μ΄νΈνλ€.
- A.formUnion(B) = A μ μλ Bμ μμλ₯Ό μΆκ°νλ€.
- κ΅μ§ν© (A∩B) :: λ μ§ν©μ 곡ν΅μ μΌλ‘ μλ μμλ₯Ό ν¬ν¨μν¨λ€.
- intersection(_:) λ©μλλ λ Set μ κ΅μ§ν©μΌλ‘ μλ‘μ΄ Set μ λ§λ€μ΄ λ°ννλ€.
- formIntersection(_:) λ©μλλ λ Set μ κ΅μ§ν©μΌλ‘ μλ³Έ Set μ μ λ°μ΄νΈνλ€.
- A.formIntersection(b) = A μ μλ Bμ μμλ₯Ό μμ νλ€.
- μ¬μ§ν© (A∪B - A∩B) :: λ μ§ν©μ μ 체 μ§ν©μμ λ μ§ν©μ 곡ν΅μΌλ‘ μλ μμλ₯Ό μ μΈνλ€.
- symmetricDifference(_:) λ©μλλ λ Set μ μ¬μ§ν©μΌλ‘ μλ‘μ΄ Set μ λ§λ€μ΄ λ°ννλ€.
- formSymmetricDifference(_:) λ©μλλ λ Set μ μ¬μ§ν©μΌλ‘ μλ³Έ Set μ μ
λ°μ΄νΈνλ€.
- μ°¨μ§ν© (A-B) :: A μ§ν©μμ B μ§ν©μ μμλ₯Ό μ μΈνλ€.
- subtracting(_:) λ©μλλ μλ³Έ Set μμ μ£Όμ΄μ§ Set μ ν¬ν¨λμ§ μλ μμλ‘ μλ‘μ΄ Set μ λ§λ€μ΄ λ°ννλ€.
- subtract(_:) λ©μλλ μλ³Έ Set μμ μ£Όμ΄μ§ Set μ μμλ₯Ό μμ νλ€.
// Set μ°μ°
var A: Set = ["A", "B", "C", "D"]
let B: Set = ["C", "D", "E", "F"]
// ν©μ§ν© ["B", "E", "D", "A", "C", "F"]
let unionSet = A.union(B)
// κ΅μ§ν© ["C", "D"]
let intersectionSet = A.intersection(B)
// μ¬μ§ν© ["B", "E", "A", "F"]
let complementSet = A.symmetricDifference(B)
// μ°¨μ§ν© ["B", "A"]
let subtractSet = A.subtracting(B)
βοΈ Set μ λμ°λ―Έ λ©μλλ€
- isSubset(of:) λ©μλλ μλ³Έ Set μ΄ μ£Όμ΄μ§ Set μ λΆλΆ μ§ν©μΈμ§ νμΈν΄ Bool κ°μ λ°ννλ€.
- isStrictSubset(of:) λ©μλλ λλ±ν Set μ΄ μλ λΆλΆ μ§ν©μΈμ§ νμΈν΄ Bool κ°μ λ°ννλ€.
- λΆλΆμ§ν©μ΄ μλκ±°λ λλ±ν κ²½μ° False, λλ±νμ§ μκ³ λΆλΆμ§ν©μΈ κ²½μ° True
- isSuperset(of:) λ©μλλ μλ³Έ Set μ΄ μ£Όμ΄μ§ Set μ μμμ§ν©μΈμ§ νμΈν΄ Bool κ°μ λ°ννλ€.
- isSubset λ©μλμ λ°λλλ κ°λ μ΄λ€.
- isStrictSuperset(of:) λ©μλλ λλ±ν Set μ΄ μλ μμ μ§ν©μΈμ§ νμΈν΄ Bool κ°μ λ°ννλ€.
- isDisjoint(with:) λ©μλλ λ Set μ κ³΅ν΅ μμκ° μλμ§ νμΈν΄ Bool κ°μ λ°ννλ€.
- 곡ν΅μμκ° μμΌλ©΄ True , 곡ν΅μμκ° μμΌλ©΄ False
- 곡ν΅μμκ° μμΌλ©΄ True , 곡ν΅μμκ° μμΌλ©΄ False
let A: Set = ["A", "B", "C", "D"]
let B: Set = ["C", "D", "E", "F"]
let C: Set = ["A", "B"]
// λΆλΆμ§ν©μΈμ§ λΉκ΅νκΈ°
A.isSubset(of: C) // false
C.isSubset(of: A) // true
// μμ ν λΆλΆμ§ν©μΈμ§ λΉκ΅νκΈ°
let D: Set = ["A", "B", "C", "D"]
B.isStrictSubset(of: A) // false
C.isStrictSubset(of: A) // true
D.isStrictSubset(of: A) // false
// μμμ§ν©μΈμ§ λΉκ΅νκΈ°
A.isSuperset(of: C) // true
A.isStrictSuperset(of: D) // false
// 곡ν΅μμκ° μλμ§ νμΈνκΈ°
A.isDisjoint(with: C) // false
A.isDisjoint(with: ["E", "F"]) // true
μ°Έκ³ λ§ν¬