2015-02-02 5 views
6

myFunc 참조가 모호하다는 컴파일 시간 오류가 발생합니다.Swift - 변수에 오버로드 된 함수 할당

func f (s: String) -> String { return "version 1: " + s } 
func f(sourceString s: String) -> String { return "version 2: " + s } 
var myFunc: (String)-> String = f as (sourceString : String)->String 

위 예제에서 오버로드 된 함수 f의 각 버전을 명시 적으로 참조하려면 어떻게해야합니까? 내가 func f 선언을 주석 처리하면 컴파일되고 작동합니다. 하지만 둘 다 선언 된 경우 각 함수를 참조하는 방법을 알고 싶습니다. 감사.

+0

내게 도움이된다면 알려주세요. 나는 더 많은 것을 도울 수있다 –

답변

4

흥미로운 내용입니다. @ marcos의 제안을 따라 뭔가를하지 않고는 불가능하다고 생각합니다.

func f(s: String, i: Int) { println("_: \(s)") } 
func f(#s: String, #i: Int) { println("s: \(s)") } 

그런 다음 튜플을 통해 호출 할 수 있습니다 : 지금 당신은 하나를 임명했다 인수를 제외하고 동일한 두 가지 기능을 정의한다고 가정

let named_pair = (s: "hello", i: 1) 
named_pair.s // hello 

let anon_pair = named_pair as (String,Int) 
// or anon_pair: (String,Int) = named_pair, if you prefer 
anon_pair.s // no such member 's' 

을 : 문제는 당신이 튜플에 이름을 "버려야"할 수있다 이름이 인수 대라는 이름으로 :

f(named_pair) // prints s: hello 
f(anon_pair) // prints _: hello 

// but if you try to call a named argument function with unnamed tuples: 
func g(# s: String, # i: Int) { println("s: \(s)") } 
g(anon_pair) // compiler error 

let h = g 
h(anon_pair) // compiler error 
h(named_pair) // works 

하지만이 이름을 멀리 캐스팅 할 수 있기 때문에이 작업을 수행 할 수 있습니다

// compiles and runs just fine... 
(g as (String,Int)->())(anon_pair) 
let k: (String,Int)->() = g 
// as does this 
k(anon_pair) 

이 기능을 사용하면 내가 알 수있는 한 형식을 사용하여 인수 이름으로 만 오버로드 된 함수를 명확히 할 수 없음을 의미합니다.

+0

사려 깊은 반응에 감사드립니다. 이 모든 것에 대한 훌륭한 토론. 속도 속도 - 나는 그것을 두려워했습니다. 실용적인 관점에서 볼 때 (과부하를 피하기 위해 함수의 이름을 항상 바꿀 수는 있지만) 학문적 관점에서 볼 때 그 이상입니다.일급 데이터 유형으로서 언어 지원 기능이 과부하 기능을 모호하지 않게 참조 할 수없는 시나리오를 가지고 있다는 점이 다소 불만 스럽습니다. 좋습니다 - 저의 학자는 실망합니다, 실용 주의자는 이것을 "실생활"에 거의 적용하지 않을 것입니다 :-) –

+0

제가 생각했던 또 다른 접근법은 초기에 변수에 지정된 클로저로 두 번째를 선언하는 것이 었습니다. 그것도 작동 할 것이지만, 나는 언어가 명명 된 매개 변수 모호성 제거를 포함하는 함수 시그니처를 참조하는 방법을 갖기를 정말로 바라고 있습니다. –

1
  • 인수 개수는 다양해야합니다.
  • 인수의 수가 같은 경우 해당 데이터 형식은 이어야합니다.

 
func f(x : String) -> NSString { 
     return a 
    } 
func f(x : UInt) -> NSString { 
      return "{\(x)}" 
     } 
+3

반드시. Swift의 함수는 외부 매개 변수 이름에 의해서만 다를 수 있습니다. –

+0

감사합니다. @IvicaM. 나는 그것을 몰랐다. –

0

나는 당신이 할 수 있다고 생각하지 않습니다. 당신은 하나 또는 다른 호출 할 수 있습니다 : 당신이 원하는 무엇을 정확하게하는 방법을 모른다

println(f("test")) // version 1: test 
println(f(sourceString: "test")) // version 2: test 
+0

고마워요, 이비차. 각 함수를 호출 할 때 아무런 문제가 없습니다. 하지만 나는 각각에 대한 변수 참조를 원한다. (퍼스트 클래스 유형의 함수는 각 함수에 변수를 명확하게 지시 할 수 있어야한다.) –

5

,하지만 어쩌면이 도움이 :

var myFunc1: (String)-> String = { s in f(sourceString: s) } 
var myFunc2: (String)-> String = { s in f(s) } 

이제 호출 할 수 있습니다

let s1 = myFunc1("one") // returns "version 2: one" 
let s2 = myFunc2("two") // returns "version 1: two" 
+0

답장을 보내 주셔서 감사합니다, 마르코스. 오버로드하지 않음에 동의합니다. 문제를 피합니다. 유일한 차이점이 명명 된 매개 변수에있을 때 특정 함수 시그니처를 지정하는 방법에 더 관심이 있습니다. 제 관심은 많은 학문입니다 (주위에있는 일이 효과가있을 것이므로). 별도의 이름 이외의 함수 참조를 모호하게하는 방법이 있습니까? –