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[] {
         ^

所以看起来我可以使用重复的方法和签名创建扩展方法,但我需要一种特殊的方式来调用它


顺便说一句,默认值Array.filter已损坏,它为每个元素调用两次闭包并崩溃 REPL 或者如果结果不一致,则在操场上给出垃圾结果

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
4

1 回答 1

2

我认为定义模棱两可的方法没有问题。当您从不同的模块导入2 ambiguos 方法时,就会出现问题。不幸的是,没有办法Array.filter从被导入中排除。

我做了一些测试,在我看来,模棱两可的定义的行为没有得到很好的定义,例如:

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}"
于 2014-06-07T13:05:37.237 回答