[Swift] Array의 Sum구하기


주로 sum함수를 구현하고자 한다면 이렇게 구현을 합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
func sum(numbers: [Int]) -> Int {
// 1
return numbers.reduce(0, +)

// 2
// return numbers.reduce(0, {$0 + $1})

// 3
// var res = 0
// numbers.forEach { num in
// res += num
// }
// return res
}


print(sum(numbers: [1, 2, 3])) // 6

그런데 이렇게 구현한 경우에는 Int타입만 받을 수 있기 때문에 추후에 구현해야할 수도 있는 Double, Float, CGFloat등의 타입의 ArraySum을 구하기 위해 각각의 함수를 따로 구현해야 합니다. (doubleSum, floatSum… )

이러한 고민을 말끔하게 해결해줄 친구가 바로 generic입니다. 각 타입별로 함수를 따로 만들지 않아도 하나의 코드에서 여러 타입에 대한 대응이 가능하게 됩니다.

1
2
3
4
5
6
7
8
extension Array where Element: Numeric {
func mySum() -> Element {
return self.reduce(0, +)
}
}

print([1, 2, 3].mySum()) // 6
print([1.1, 2.2, 3.3].mySum()) // 6.6

extensiongeneric constraint를 위해 Numeric protocol을 사용하여 여러 타입에 대응한 코드입니다.
Array에는 여러 Array가 있으므로 binary arithmetic operation이 지원되는 타입에만 mySum이 실행되게끔 Numeric protocol을 사용합니다.

이렇게 generic을 사용하면 깔끔한 코딩이 가능합니다.

Numeric’s Declaration

Declares methods backing binary arithmetic operators–such as +, - and *–and their mutating counterparts.

(Tip) for에서의 where 사용

1
2
3
4
for i in 0...10 where i % 2 == 0 {
print(i)
}
// 0 2 4 6 8 10
Share