으니의 개발로그

[Swift] 맵(map) 본문

Swift/책 정리

[Swift] 맵(map)

아잉으니야 2021. 2. 3. 23:06

[Swift] 맵(map)

이 글은 Swift 프로그래밍 책을 읽고 요약한 내용입니다.

 

맵 : 자신을 호출할 때 매개변수로 전달된 함수를 실행하여 그 결과를 다시 반환해주는 함수

배열, 딕셔너리, 세트, 옵셔널 등에서 사용할 수 있다.

 

for-in 구문과 맵 메서드의 사용 비교

let numbers: [Int] = [0, 1, 2, 3, 4]

var doubleNumbers: [Int] = [Int]()
var strings: [String] = [String]()

// for 구문 사용
for number in numbers {
    doubleNumbers.append(number * 2)
    strings.append("\(number)")
}

print(doubleNumbers)
/* [0, 2, 4, 6, 8] */
print(strings)
/* ["0", "1", "2", "3", "4"] */

// map 메서드 사용
doubleNumbers = numbers.map({(number: Int) -> Int in
    return number * 2
})
strings = numbers.map({(number: Int) -> String in
    return "\(number)"
})

print(doubleNumbers)
/* [0, 2, 4, 6, 8] */
print(strings)
/* ["0", "1", "2", "3", "4"] */

 

클로저 표현의 간략화

let numbers: [Int] = [0, 1, 2, 3, 4]

// 기본 클로저 표현식 사용
var doubleNumbers = numbers.map({(number: Int) -> Int in
    return number * 2
})

// 매개변수 및 반환 타입 생략
doubleNumbers = numbers.map({ return $0 * 2 })
print(doubleNumbers)
/* [0, 2, 4, 6, 8] */

// 반환 키워드 생략
doubleNumbers = numbers.map({ $0 * 2 })
print(doubleNumbers)
/* [0, 2, 4, 6, 8] */

// 후행 클로저 사용
doubleNumbers = numbers.map { $0 * 2 }
print(doubleNumbers)
/* [0, 2, 4, 6, 8] */

 

클로저의 반복 사용

let evenNumbers: [Int] = [0, 2, 4, 6, 8]
let oddNumbers: [Int] = [0, 1, 3, 5, 7]
let multiplyTwo: (Int) -> Int = { $0 * 2 }

let doubledEvenNumbers = evenNumbers.map(multiplyTwo)
print(doubledEvenNumbers)
/* [0, 4, 8, 12, 16] */

let doubledOddNumbers = oddNumbers.map(multiplyTwo)
print(doubledOddNumbers)
/* [0, 2, 6, 10, 14] */

 

다양한 컨테이너 타입에서의 맵의 활용

let alphabetDictionary: [String: String] = ["a": "A", "b": "B"]

var keys: [String] = alphabetDictionary.map{ (tuple: (String, String)) -> String in
    return tuple.0
}
print(keys)
/* ["a", "b"] */

keys = alphabetDictionary.map{ $0.0 }

let values: [String] = alphabetDictionary.map{ $0.1 }
print(keys)
/* ["a", "b"] */
print(values)
/* ["A", "B"] */


var numberSet: Set<Int> = [1, 2, 3, 4, 5]
let resultSet = numberSet.map{ $0 * 2 }
print(resultSet)
/* [8, 6, 2, 4, 10] */  // set은 순서가 없으므로 무작위로 나온다.


let optionalInt: Int? = 3
let resultInt: Int? = optionalInt.map{ $0 * 2 }
print(resultInt)
/* Optional(6) */


let range: CountableClosedRange = (0...3)
let resultRange: [Int] = range.map{ $0 * 2 }
print(resultRange)
/* [0, 2, 4, 6] */