십진계산기 및 이진계산기 각 타입에서 공통적으로 채택하여 사용하는 프로토콜과 프로토콜의 기능을 구현하기 위한 익스텐션을 작성하여 초기 구현을 하였습니다.
// 더하기 기능
protocol Addable {
associatedtype T
associatedtype T: Numeric
func add(_ operatedNumber: T, and operatingNumber: T)
var stack: Stack<T> { get set }
mutating func add(_ operatedNumber: T, and operatingNumber: T)
}
extension Addable {
func add(_ operatedNumber: T, and operatingNumber: T) {
mutating func add(_ operatedNumber: T, and operatingNumber: T) {
let sumResult = stack.sumAllElements()
stack.reset()
stack.push(sumResult)
}
}
이전에 제네릭 타입으로 구현한 Stack 구조체에 내부 요소를 모두 더할 수 있는 기능을 추가하기 위해 Numeric
프로토콜을 활용하여 sumAllElements()
메서드를 구현하였습니다. where
구문을 사용하여 sumAllElments()
메서드를 필요로 하지 않는 타입 (String 등)이 Numeric
프로토콜을 따르지 않도록 설계하였습니다.
Numeric
프로토콜기존 Stack 구조체 구현 시 내부에서 활용되는 프로퍼티 혹은 프로퍼티의 요소들이 제네릭 타입을 따르도록 하였습니다. 십진 계산기와 이진 계산기 모두 수
타입인 Double
또는 Int
계열의 타입을 따라 사용되는데, 더하기 연산 시 숫자 스택에 존재하는 모든 수를 더해주기 위해 메서드를 구현하였더니 다음과 같은 에러가 발생하였습니다.
에러에서는 RangeReplaceableCollection
프로토콜의 채택을 권고했는데, 이는 덧셈 연산에만 유효할 뿐 기타 뺄셈, 곱셈, 나눗셈 연산은 FloatingPoint
프로토콜 채택을 권고했습니다.
하지만 FloatingPoint
프로토콜을 채택하면 Int
타입의 요소를 가지는 스택의 인스턴스를 생성할 수 없는 문제가 있었습니다.
이후 정수형과 실수형의 사칙연산을 지원하는 프로토콜을 찾던 중 Numeric
프로토콜을 발견하였습니다.
프로토콜의 설명 요약에는 곱셈을 지원하는 값의 타입
이라고 설명되어 있고, Discussion에는 정수 및 부동소수형 수
와 같은 스칼라 값의 연산을 위한 기초를 제공하는 프로토콜이라고 설명되어 있습니다. 활동 내용에서 사용한 예시처럼 이용하면 되겠습니다.