구현하는 데에 딱히 어려운 점을 느끼지 못했는데
2가지 정도의 문제 때문에 많은 시간을 할애 했던 것이 기억에 남아 한 번 정리를 해보려 함
'Calculator' initializer is inaccessible due to 'internal' protection level
Property 'description' must be declared public because it matches a requirement in public protocol 'CustomStringConvertible'
원래 하나였던 코드를 분리하니까 이상한 에러가 뜨기 시작해서 구글링 해본 결과
public 프로토콜을 채택하면 요구사항을 충족하는 프로퍼티도 public이어야 하는데 아무것도 안 붙여줘서 에러가 떴던 것 같았음
이걸 잊고 있었네.......
파일을 나누면 기본 접근 제어자가 internal이니까 다른 파일에서 접근을 못 하는데 이걸 잊고 있었으니
코드에 무슨 문제가 있는지 눈 씻고 찾아봐도 찾을 수가 없었다..
접근이 필요한 모든 타입, 메서드, 프로퍼티, init 에 public 명시를 해서 해결했음
public final class Calculator {
// 연산자 symbol, 연산 객체 매핑
private var operations: [String: any Operation] = [:]
// 초기화 하고 나서 사용할 연산 등록
public init(with operations: [any Operation]) {
for operation in operations {
self.operations[operation.symbol] = operation
}
}
// symbol : 연산자 기호
// lhs : leftNumber
// rhs : rightNumber
// Throws : 발생한 오류
// Returns : 결과 값
public func calculate(symbol: String, lhs: Double, rhs: Double) throws -> Double {
guard let operation = operations[symbol] else {
throw CalculatorError.invalidOperator
}
return try operation.execute(lhs, rhs)
}
}
public protocol Operation {
var symbol: String { get } // 연산자 기호
func execute(_ lhs: Double, _ rhs: Double) throws -> Double
}
public enum CalculatorError: Error, CustomStringConvertible {
case divideByZero // 0으로 나누기 시도
case invalidOperator // 지원하지 않는 연산자
public var description: String {
switch self {
case .divideByZero:
return "0으로는 나눌 수 없음"
case .invalidOperator:
return "지원하지 않는 연산자"
}
}
}
요주의 Calculator.swift, Operation.swift, CalculatorError.swift의 파일 안에 있는 코드들에 public을 붙여서 접근 가능하도록 구현해서 에러를 고치게 됨
그리고 이건 너무 어처구니 없어서 안 적으려 했는데 playground에 대한 정보가 많이 없을 뿐더러
이 때 아니고서야 playground를 언제 써보겠나 싶어서 간단한 기능에 대해 정리해보려 함

지금 내 프로젝트의 파일 구조가 이 상태인데 Ccalculator 라는 최상위 파일 안에만 실행 버튼이 있어서
Ccalculator 안에 코드를 넣어주지 않으면 실행 자체를 해볼 수가 없었음
내가 못 찾은건지 원래 안 되는 건지 잘 모르겠지만
github에 올렸을 때도 ContentView에 코드가 올라가는 걸로 봐선 쟤가 mainView 인 듯 했음
그래서

Ccalculator에 동작을 위한 코드를 넣어 줬는데
오른쪽에 보면 값이
"10.0 * 2.0 = 20.0\n",
"오류 (10.0 % 0.0) -> 0으로는 나눌 수 없음"
이것만 떠서 처음에는 코드에 문제가 있는 줄 알았음
근데 아무리 디버깅을 해도 찾을 수가 없어서 튜터님을 찾아 뵀는데

값이 뜨는 창 오른쪽 밑 버튼을 누르게 되면

이런 식으로 값이 잘 뜨는 걸 볼 수 있음.
그니까 한 마디로 약 2시간 정도를 저것 때문에 삽질했다는 것..!
그래도 이번 기회에 playground 구조를 알게 된 느낌..!