반응형
기초문법을 훑고 있습니다. 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
'프로그래밍 > SWIFT' 카테고리의 다른 글
[Swift] swift 단일 스크립트 파일을 컴파일하기 (0) | 2022.06.16 |
---|---|
Swift 북마크 (0) | 2022.06.08 |
[Swift] dependency <library> in target <project> requires explicit declaration; reference the package in the target dependency with '.product(name: <library>, package: <library package>)' (0) | 2022.06.01 |
Swift Optional 몇가지 실험 (0) | 2022.05.27 |
swift 코드를 간단히 console에서 실행하기 (0) | 2022.05.26 |