맵, 필터, 리듀스 직접 구현하기 질문드려요.

1 답변 글타래를 보이고 있습니다
  • 글쓴이
    • Zizi_Kim
      참가자
      • 글작성 : 1
      • 답글작성 : 1

      책: Swift 3판 (야곰, 한빛미디어), P. 443 (코드 23-6)

       

      안녕하세요. 책을 보고 공부하다 지네릭스 적용과 해석이 헷갈려 질문드립니다. 

       

          func map<T>(transform: (Element) -> T) -> Stack<T> {

              var mapStack: Stack<T> = Stack<T>()

              

              for item in items {

                  mapStack.items.append(transform(item))

              }

              return mapStack

          }

       

      var stack: Stack<Int> = Stack<Int>()

      <..생략..>

      stack = stack.map { Double($0 * 3) } // 에러 코드 Cannot convert value of type ‘Double’ to closure result type ‘Int’ – 질문 코드입니다.

      print(stack.items)

       

      map 함수 구현에서 타입 매개변수를 Element와 T를 사용했는데, T는 언제 타입이 결정되는 건가요?  transform(_:) 함수에서 결과값이 반환될 때 결정되는 건가요?  

      Double 타입으로 변환하려니 에러가 출력됩니다. 반환 타입은 타입 매개변수 T이므로 Double 타입으로 반환을 해도 문제가 없다고 생각되는데, 에러가 뜨니 이유를 모르겠네요.

       

      답변 정말 감사드립니다.

       

    • rhrnakrnakr
      참가자
      • 글작성 : 0
      • 답글작성 : 40

      음 일단 문제에 대해 답변을 드리기에 앞서서, 현상을 인지하는 게 선행되어야할 것 같습니다.

      아마 에러는 코드를 작성하고 계시던 중에 발생했을텐데요. 코드를 작성을 하던 도중에 에러가 나왔다는 건, 일반적으로 해당 문제가 빌드 과정에 인지할 수 있고, 또 평가된다는 이야기입니다.

      따라서 제네릭은 컴파일 타임에 평가됩니다.

      말씀하신 결과값이 반환될 때는 런 타임이구요. 용어가 낯설다면 따로 찾아보시면 좋겠습니다.

      에러가 뜨는 이유는 컴퓨터가 말을 해주고 있네요. 위의 내용을 토대로 제네릭을 따로 공부해보시고 다시 고민해보시면 좋겠습니다

       

      • Zizi_Kim
        참가자
        • 글작성 : 1
        • 답글작성 : 1

        안녕하세요.  코드를 다시 보니 <Int> 타입에 <Double> 타입을 넣으려고 시도해서 에러가 나는군요. 질문 당시에 코드를 조금 더 꼼꼼히 봤어야 했는데 그러지 못했네요. 답변 감사드립니다. 

1 답변 글타래를 보이고 있습니다
  • 답변은 로그인 후 가능합니다.

logo landscape small

사업자번호 : 743-81-02195
통신판매업 신고번호 : 제 2022-충북청주-1278 호
고객센터 : 카카오톡채널 @yagom