2014-06-07 10 views
5

는 오류 메시지와 함께 컴파일 할 수 없습니다이 코드모호한 메서드를 호출하는 방법?

extension Array { 
    func filter(includeElement: (T) -> Bool) -> T[] { 
     var ret = T[]() 
     for e in self { 
      if includeElement(e) { 
       ret += e 
      } 
     } 
     return ret 
    } 
} 

var a = [1,2] 
var b = a.filter() {i in print(i); return true} 

을 부여

error: ambiguous use of 'filter' 
var b = a.filter() {i in print(i); return true} 
     ^
Swift.Array<T>:84:8: note: found this candidate 
    func filter(includeElement: (T) -> Bool) -> Array<T> 
    ^
<REPL>:30:10: note: found this candidate 
    func filter(includeElement: (T) -> Bool) -> T[] { 
     ^

내가 중복 방법 서명으로 확장 메서드를 만들 수 있어요 같은 보이지만, 어떻게 든 특별한 방법이 필요합니다 를 호출하는

BTW, 기본 Array.filter가 고장

, 그것은 각 요소에 대해 두 배의 폐쇄를 호출하고 R 충돌 EPL 또는 결과가 일치하지 않는 경우 놀이터에서 쓰레기 결과를 내십시오.

xiliangchen-imac:~ xiliangchen$ xcrun swift 
Welcome to Swift! Type :help for assistance. 
    1> let arr = [1,2,3,4,5] 
arr: Int[] = size=5 { 
    [0] = 1 
    [1] = 2 
    [2] = 3 
    [3] = 4 
    [4] = 5 
} 
    2> var i = 0 
i: Int = 0 
    3> let arr2 = arr.filter() { 
    4.   println($0) 
    5.   return i++ < 5 
    6. } 
Segmentation fault: 11 
+0

좋은 질문입니다. 단지 2 센트 만 : Objective-C에서도 카테고리를 사용하는 기존 방법을 무시하면 UB가 발생할 수 있습니다. 맞습니까? 아마 스위프트는 이것에 대한 보강을하고 있습니까? 내가 틀렸다면 나를 바로 잡아라. – Unheilig

+0

@Unheilig 네, ObjC에서는 UB입니다. 그러나 이것은 다소 다릅니다. 같은 이름의 새 메소드를 ** 추가 ** (재정의하지 않음) 할 수 있습니다. 하지만 내가 그걸 부르면 안된다. 이미'filter' 메소드를 사용하여 일부 컴파일 된 라이브러리 이미징, 나는 여전히 작동하고 기본 호출을 사용하여 신속하게 정적 디스패치를 ​​사용한다고 가정합니다() 생각합니다. –

+0

'filter'에 멋진 형사 작업! 버그 보고서를 작성하는 것을 잊지 마십시오. – matt

답변

2

모호한 방법을 정의하는 데는 문제가 없습니다. 이 문제는 다른 모듈에서 개의 ambiguos 메소드를 가져올 때 발생합니다. 죄송하지만 Array.filter을 가져 오는 것을 제외하는 방법은 없습니다.

나는 몇 가지 테스트를했고 그것을 잘 예를 들어, 정의되지 않은 나에게 ambigious 정의에 대한 동작을 나타납니다

extension NSString { 
    func hasPrefix(aString: String!) -> Bool { 
     return false 
    } 
} 

let string: NSString = "test" 

var hasPrefix = string.hasPrefix("t") 
println("Has prefix: \(hasPrefix)") //prints "true" 

var method = string.hasPrefix 
hasPrefix = method("t") 

println("Has prefix: \(hasPrefix)") //prints "false" 

동작은 OBJ-C 클래스 다를 수 ...

함수의 경우 현재 모듈의 정의가 선호됩니다.

func NSStringFromCGPoint(point: CGPoint) -> String! { 
    return "My method" 
} 

var point = CGPoint(x: 10.0, y: 10.0) 

println("Point: \(NSStringFromCGPoint(point))") //Prints "My method" 
println("Point: \(UIKit.NSStringFromCGPoint(point))") //Prints "{10, 10}" 
관련 문제