시퀀스란?
프로토콜
자기 자신의 요소 값들이 반복적, 순차적 접근되는 것을 제공하는 타입
시퀀스 프로토콜을 준수하는 타입은 for-in 루프로 순회할 수 있음
for - in 으로 구현하는것과 차이는 없지만
위와 같이 전달인자로 함수(컨테이너 내부 데이터를 변경하는)를 받는다.
또한 아래와 같이 후행 클로저로 사용할 수 있다.
let numbers = [1, 2, 3, 4, 5]
for number in numbers {
number += 1
}
let numbers = [1, 2, 3, 4, 5]
let number = numbers.map { $0 + 1 }
반복문 + 조건문 형식이다.
var filtered: [Int] = [Int]()
for num in nums {
if num % 2 == 0 {
filtered.append(num)
}
}
print(filtered)
let nums = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
let evenNums = nums.filter { num in
return num % 2 == 0
}
print(evenNums)
let oddNums = nums.filter { $0 % 2 == 1 }
print(oddNums)
func reduce<Result>(_ initialResult: Result, _ nextPartialResult: (Result, Element) throws -> Result) rethrows -> Result
initialResult
initialResult
는 클로저가 처음 실행될 때 nextPartialResult
에 전달nextPartialResult
Result
→ nextPartialResult
클로저의 다음 호출에 사용되거나 호출자에게 반환될 누적 값Element
→ 시퀀스 요소Result
와 Element
를 새로운 누적 값으로 결합하는 클로저.initialResult
nextPartialResult
클로저는 initialResult
와 숫자의 첫 번째 요소로 호출돼 연산 후 반환// 방법 1 : 기본
// 초깃값이 0이고 someNumbers 내부의 모든 값을 더합니다.
let numberArray1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
let sum: Int = numberArray1.reduce(0, { (result: Int, currentItem: Int) -> Int in
print("result: \(result) / currentItem: \(currentItem)")
return result + currentItem
})
print(sum) // 55
// 방법 2 : 매개변수, 반환 타입, 반환 키워드(return) 생략, 후행 클로저
// 초깃값이 3이고 someNumbers 내부의 모든 값을 더합니다.
let numberArray2 = [1, 2, 3, 4, 5]
let multiplicationFromTen = numberArray2.reduce(10) { $0 * $1 }
print(multiplicationFromTen) // 1200
result
→ 초깃값으로부터 출발하여 마지막 요소까지 순회한 결과값currentItem
→ 현재 순회하고 있는 요소의 값return result + currentItem
→ 현재까지 더해진 결과값에 이번 요소의 값을 더함 의미let numbers = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
let flatMapTest = numbers.flatMap{ $0 }
print(flatMapTest) // [1, 2, 3, 4, 5, 6, 7, 8, 9]
func flatMap<SegmentOfResult>(_ transform: (Self.Element) throws -> SegmentOfResult) rethrows -> [SegmentOfResult.Element] where SegmentOfResult : Sequence
let numbers = ["42", "19", "notANumber"]
let compactMapTest = numbers.compactMap{ Int($0) }
print(compactMapTest) // [42, 19]
let numbers = [0, 2, nil , Optional(4)]
let compactMapTest = numbers.compactMap{ $0 }
print(compactMapTest) // [0, 2, 4]
let numbers = [1,nil, 2,nil, 3, 4,nil]
let compactMapTest = numbers.compactMap { $0 }
print(compactMap) // [1, 2, 3, 4]
func compactMap<ElementOfResult>(_ transform: (Self.Element) throws -> ElementOfResult?) rethrows -> [ElementOfResult]