본문 바로가기

프로그래밍/SWIFT

Swift Closure error: ambiguous use of operator

반응형

기초문법을 훑고 있습니다. closure 라는 것이 나와서, 가장 간단한 축약표현을 한번 써보고 싶었습니다. 그런데, error: ambiguous use of operator '+' 라는 에러가 발생하네요.

코드는 아래와 같습니다.

for ab in [ [1,2], [3,4] ] {
	let a = ab[0]
    let b = ab[1]
    for op in [ { $0+$1 }, { $0-$1 } ] {
    	print(a, b, op(a, b))
    }
}

코드의 의도는 정수쌍에 대해서 더하기도 해보고, 빼기도 해보고 그 결과값을 확인해 보는 겁니다. 더하기와 빼기 같은 연산자를 for 루프에 돌려보기 위해서, closure 를 만들어 썼습니다.

에러메시지는 for op in 라인에서 { $0+$1 } 부분의 + 를 가리키며 다음과 같았습니다.

my.swift:21:18: error: ambiguous use of operator '+'
  for op in [ { $0+$1 }, { $0-$1 } ] {

Swift.Float:2:24: note: found this candidate
  public static func + (lhs: Float, rhs: Float) -> Float
                     ^
Swift.Double:2:24: note: found this candidate
  public static func + (lhs: Double, rhs: Double) -> Double
                     ^
  ...

축약하지 않은 클로저 정의는 타입도 함께 들어가서 꽤 복잡(아래)했기 때문에 축약표현을 썼는데, 

{ (a: Int, b: Int) -> Int in return a+b }
{ (a: Int, b: Int) -> Int in return a-b }

이렇게 되면 어떻게 축약표현을 쓰라는 것일까요?

하지만, 한참 에러메시지를 보면서 생각을 해 보고 해결책을 찾았습니다. { $0+$1 } 이라고 주어진, 타입이 제거된 클로져 표현식에 (쓸 수 있는 여러종류의 연산자 중에서) 어떤 타입의 연산자를 사용할 지 모르겠다는 게 에러메시지의 내용입니다. 

타입을 명시적으로 알려줍시다. as [ (Int, Int) -> Int ] 라고 주어서 말이죠.

for ab in [ [1,2], [3,4] ] {
	let a = ab[0]
    let b = ab[1]
    for op in [ { $0+$1 }, { $0-$1 } ] as [ (Int, Int) -> Int ] {
    	print(a, b, op(a, b))
    }
}

이렇게 수정하고서 에러가 없어졌습니다.

타입신경쓰지 않던 파이썬 세계에서 너무 오래 놀았나 봅니다.

728x90