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
좋은 질문입니다. 단지 2 센트 만 : Objective-C에서도 카테고리를 사용하는 기존 방법을 무시하면 UB가 발생할 수 있습니다. 맞습니까? 아마 스위프트는 이것에 대한 보강을하고 있습니까? 내가 틀렸다면 나를 바로 잡아라. – Unheilig
@Unheilig 네, ObjC에서는 UB입니다. 그러나 이것은 다소 다릅니다. 같은 이름의 새 메소드를 ** 추가 ** (재정의하지 않음) 할 수 있습니다. 하지만 내가 그걸 부르면 안된다. 이미'filter' 메소드를 사용하여 일부 컴파일 된 라이브러리 이미징, 나는 여전히 작동하고 기본 호출을 사용하여 신속하게 정적 디스패치를 사용한다고 가정합니다() 생각합니다. –
'filter'에 멋진 형사 작업! 버그 보고서를 작성하는 것을 잊지 마십시오. – matt