π‘ν¨μν νλ‘κ·Έλλ°μμμ λͺ¨λλ?
- μμκ° μλ μ°μ°μ μ²λ¦¬ν λ μμ£Ό νμ©νλ λμμΈ ν¨ν΄
π‘νλ‘κ·Έλλ°μμ λͺ¨λλκ° κ°μΆ°μΌ ν 쑰건
1. νμ μ μΈμλ‘ λ°λ νμ (νΉμ νμ μ κ°μ ν¬μ₯)
2. νΉμ νμ μ κ°μ ν¬μ₯ν κ²μ λ°ννλ ν¨μ(맀μλ)κ° μ‘΄μ¬
3. ν¬μ₯λ κ°μ λ³ννμ¬ κ°μ ννλ‘ ν¬μ₯νλ ν¨μ(맀μλ)κ° μ‘΄μ¬
ν¬κ² 3κ°μ§ κ°λ μ μμλ³΄κ² λ κ²μ΄λ€.
1οΈβ£ 컨ν μ€νΈ
2οΈβ£ ν¨μκ°μ²΄
3οΈβ£ λͺ¨λλ
1οΈβ£ 컨ν μ€νΈ
컨ν μ€νΈ = μ»΅
μ½ν μΈ = μ»΅ μμ λ΄κ²¨μλ λ¬Ό
μ¦, 컨ν μ€νΈλ μ΄λ€ μμΉμ κ°μ΄ μ‘΄μ¬ν μ μλ λ§₯λ½ μ΄λΌκ³ λ³Ό μ μλ€.
μ¬κΈ°μ μ°λ¦¬λ Optional μ μ½κ² λ μ¬λ¦΄ μ μλ€. Optionalμ κ°μ΄ μμ μλ, μμ μλ μμ!!
Optional
λͺ¨λλ 쑰건 1 λ§μ‘± : Optionalμ Wrapped νμ μ μΈμλ‘ λ°λ (μ λ€λ¦) νμ μ΄λ€.
λͺ¨λλ 쑰건 2 λ§μ‘± : Optional νμ μ Optional<Int>.init(2) μ²λΌ λ€λ₯Έ νμ (Int)μ κ°μ κ°λ μνμ 컨ν μ€νΈλ₯Ό μμ±ν μ μλ€.
λͺ¨λλ 쑰건 3μ λ§μ‘±νλ μ§λ μ΄μ μ²μ²ν μμ보μ.
addThree ν¨μ
func addThree(_ num: Int) -> Int {
return num + 3
}
addThree(Optional(2)) // μ€λ₯ λ°μ!
Int νμ μ κ°μ μ λ¬λ°μ 3μ λνμ¬ λ°ννλ ν¨μμ μ΅μ λμ μ λ¬μΈμλ‘ μ¬μ©νλ©΄ μ€λ₯κ° λλ€.
μ? μμν κ°μ΄ μλ μ΅μ λμ΄λΌλ 컨ν μ€νΈλ‘ λλ¬μΈμ¬ μ λ¬λκΈ° λλ¬Έμ΄λ€.
β° ν¨μ κ°μ²΄λ₯Ό μμ보기 μ , 맡μ λν΄ μμ보μ.
μμμ λ³Έ κ²μ²λΌ μ΅μ λμ 컨ν μ΄λμ κ°μ κ°κΈ° λλ¬Έμ 맡 ν¨μλ₯Ό μ¬μ©ν μ μλ€.
-> 맡μ μ¬μ©νλ©΄ 컨ν μ΄λ μμ κ°μ μ²λ¦¬ν μ μλ€.
맡 맀μλλ₯Ό μ¬μ©νμ¬ μ΅μ λμ μ°μ°ν μ μλ addThree(_:) ν¨μ
Optional(2).map(addThree) // Optional(5)
μ΅μ λμ 맡 λ©μλμ ν΄λ‘μ μ μ¬μ©
var value: Int? = 2
value.map{$0+2}
print(value) // Optional(2)
value = nil
value.map{$0+2}
print(value) // nil
2οΈβ£ ν¨μ κ°μ²΄
π‘ν¨μ κ°μ²΄λ? 맡μ μ μ©ν μ μλ 컨ν μ΄λ νμ
Optional(2).map(addThree) λ‘ ν¨μ κ°μ²΄μ 맡 λ©μλμ λμμ μμΈν μμ보μ.
1. λ§΅μ΄ ν¨μλ₯Ό μΈμλ‘ λ°λλ€. : map(addThree)
2. ν¨μκ°μ²΄μ λ§΅μ΄ μ λ¬λ°μ ν¨μλ₯Ό μ μ© : Optional(2)
3. μλ‘μ΄ ν¨μ κ°μ²΄λ₯Ό λ°ν : Optional(5)
μ΅μ λμ map λ©μλ ꡬν
extension Optional {
func map<U>(f: (Wrapped) -> U) -> U {
switch self {
case .some(let x): return f(x)
case .none: return .none
}
}
}
-> switch λ¬Έμμ λ§μ½ κ°μ΄ μλ€λ©΄, μ λ¬λ°μ ν¨μμ μμ μ κ°μ μ μ©ν κ²°κ΄κ°μ λ€μ 컨ν μ€νΈμ λ£μ΄ λ°ν
-> κ°μ΄ μλ€λ©΄, ν¨μλ₯Ό μ€ννμ§ μκ³ λΉ μ»¨ν μ€νΈλ₯Ό λ°ννλ€.
3οΈβ£ λͺ¨λλ
π‘λ«ν ν¨μκ°μ²΄?
- ν¨μκ°μ²΄ μ€μμ μμ μ 컨ν μ€νΈμ κ°μ 컨ν μ€νΈμ ννλ‘ λ§΅νν μ μλ ν¨μκ°μ²΄
- λͺ¨λλλ λ«ν ν¨μκ°μ²΄μ΄λ€!
π‘νλ«λ§΅?
- λͺ¨λλκ° λ§΅νμ μνν λ νμν λ©μλ
νλ«λ§΅μ 맡과 κ°μ΄ ν¨μλ₯Ό 맀κ°λ³μλ‘ λ°κ³ , μ΅μ λμ λͺ¨λλμ΄λ―λ‘ νλ«λ§΅μ μ¬μ©ν μ μλ€.
μ§μλ©΄ 2λ₯Ό κ³±ν΄μ λ°ννκ³ μ§μκ° μλλΌλ©΄ nilμ λ°ννλ ν¨μ doubleEven(_:)
doubleEven(_:) ν¨μμ νλ«λ§΅μ μ¬μ©
func doubleEven(_ num: Int) -> Int? {
if num.isMultiple(of: 2){
return num * 2
}
return nil
}
Optional(3).flatMap(doubleEven)
// nil (== Optional<Int>.none)
Optional(3).flatMap(doubleEven)μ λμ
1. 컨ν μ€νΈλ‘λΆν° κ° μΆμΆ (3)
2. μΆμΆν κ°μ doubleEven ν¨μμ μ λ¬
3. λΉ μ»¨ν μ€νΈλ‘ λ°ν
Optional.none.flatMap(doubleEven)μ λμ
1. λΉ μ»¨ν μ€νΈ
2. νλ«λ§΅μ μ무κ²λ νμ§ μμ
3. κ²°κ΅ λ€μ λΉ μ»¨ν μ€νΈ λ°ν
β°map(_:)κ³Ό flatMap(_:)μ μ°¨μ΄
- νλ«λ§΅μ 맡과 λ¬λ¦¬ 컨ν μ€νΈ λ΄λΆμ 컨ν μ€νΈλ₯Ό λͺ¨λ κ°μ μμμΌλ‘ νννκ² νΌμ³μ€λ€λ μ°¨μ΄κ° μλ€. μ¦, ν¬μ₯λ κ° λ΄λΆμ ν¬μ₯λ κ°μ ν¬μ₯μ νμ΄μ κ°μ μμμΌλ‘ νΌμ³μ€λ€.
β°compactMap(_:) ?
Optional νμ μ μ¬μ©νμλ flatMap(_:) λ©μλλ₯Ό Sequence νμ μ΄ Optional νμ μ Elementλ₯Ό ν¬μ₯ν κ²½μ°μ compactMap(_:)μ΄λ¦μΌλ‘ μ¬μ©νλ€.
맡과 μ»΄ν©νΈμ μ°¨μ΄
let optionals: [Int?] = [1, 2, nil, 5]
let mapped: [Int?] = optionals.map{$0}
let compactMapped: [Int] = optionals.compactMap{$0}
print(mapped)
print(compactMapped)
// [Optional(1), Optional(2), nil, Optional(5)]
// [1, 2, 5]
optionalsλ ArrayλΌλ 컨ν μ΄λμ λ΄λΆμ Optionalμ΄λΌλ ννμ 컨ν μ΄λλ€μ΄ μ¬λ¬κ° λ€μ΄κ° μλ ννμ΄λ€.
1. 맡 λ©μλλ₯Ό μ¬μ©ν κ²°κ³Ό : Array 컨ν μ΄λ λ΄λΆμ κ° νμ μ΄λ ννκ° μ΄μ° λμλ , Array λ΄λΆμ κ°μ΄ μμΌλ©΄ κ·Έ κ°μ κ·Έμ ν΄λ‘μ μ μ½λμμλ§ μ€ννκ³ κ²°κ³Όλ₯Ό λ€μ Array 컨ν μ΄λμ λ΄κΈ°λ§ νλ€.
2. νλ«λ§΅μ ν΅ν΄ ν΄λ‘μ λ₯Ό μ€νν κ²°κ³Ό : μμμ λ΄λΆμ 컨ν μ΄λκΉμ§ κ°μ μΆμΆνλ€.
-> κ·Έλ κΈ° λλ¬Έμ mappedλ λ€μ [Int?] νμ μ΄ λλ©°, compactMappedλ [Int] νμ μ΄ λλ€.
μ€μ²©λ 컨ν μ΄λμμ 맡과 νλ«λ§΅(μ½€ν©νΈλ§΅)μ μ°¨μ΄
let multipleContainer = [[1, 2, Optional.none], [3, Optional.none], [4, 5, Optional.none]]
let mappedMultipleContainer = multipleContainer.map{ $0.map{ $0 }}
let flatmappedMultipleContainer = multipleContainer.flatMap{ $0.compactMap{ $0 }}
print(mappedMultipleContainer)
print(flatmappedMultipleContainer)
// [[Optional(1), Optional(2), nil], [Optional(3), nil], [Optional(4), Optional(5), nil]]
// [1, 2, 3, 4, 5]
νλ«λ§΅μ νμ© (Int νμ μ String νμ μΌλ‘ String νμ μ Int νμ μΌλ‘)
func stringToInteger(_ string: String) -> Int? {
return Int(string)
}
func integerToString(_ integer: Int) -> String? {
return "\(integer)"
}
var optionalString: String? = "2"
let flattenResult = optionalString.flatMap(stringToInteger)
.flatMap(integerToString)
.flatMap(stringToInteger)
print(flattenResult) // Optional(2)
let mappedResult = optionalString.map(stringToInteger) // λμ΄μ μ²΄μΈ μ°κ²° λΆκ°
print(mappedResult) // Optional(Optional(2))
- String νμ μ Int νμ μΌλ‘ λ³ννλ κ²μ μ€ν¨ν κ°λ₯μ±μ λ΄ν¬ν΄μ κ²°κ΄κ°μ μ΅μ λ νμ μΌλ‘ λ°ν
- Int νμ μ String νμ μΌλ‘ λ³ννλ κ²μ μ€ν¨ κ°λ₯μ±μ μμ§λ§ μλ₯Ό λ€κ³ μ μ΅μ λ νμ μΌλ‘ λ°ν
- νλ«λ§΅μ μ¬μ©νμ¬ μ²΄μΈμ μ°κ²°νμ λ κ²°κ³Όλ μ΅μ λ
- 맡μ μ¬μ©νμ¬ μ²΄μΈμ μ°κ²°νμ λ κ²°κ³Όλ μ΅μ λμ μ΅μ λ
-> μ΄μ : νλ«λ§΅μ ν¨μμ κ²°κ΄κ°μ κ°μ΄ μλ€λ©΄ μΆμΆν΄μ νννκ² λ§λλ κ³Όμ μ λ΄ν¬νκ³ , 맡μ κ·Έλ μ§ μκΈ° λλ¬Έμ΄λ€.
μ¦, νλ«λ§΅μ νμ κ°μ 컨ν μ€νΈλ₯Ό μ μ§ν μ μμΌλ―λ‘ μ΄κ°μ μ°μ μ°μ°λ κ°λ₯νλ€.
Reference
Swift μ€μννΈ νλ‘κ·Έλλ° - μΌκ³°
'Swift' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[Swift] λ°±μ€ : 10814 (ꡬ쑰체) (0) | 2022.08.02 |
---|---|
[Swift] zip(_:_:) (0) | 2022.07.27 |
[Swift] 맡, νν°, 리λμ€ (0) | 2022.03.22 |
[Swift] μ΅μ λ 체μ΄λκ³Ό λΉ λ₯Έ μ’ λ£ (guard, assert) (0) | 2022.03.20 |
[Swift] ν΄λ‘μ : Closure (0) | 2022.03.20 |