Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 如何调用不明确的方法?_Swift_Xcode6 - Fatal编程技术网

Swift 如何调用不明确的方法?

Swift 如何调用不明确的方法?,swift,xcode6,Swift,Xcode6,鉴于此代码 extension Array { func filter(includeElement: (T) -> Bool) -> T[] { var ret = T[]() for e in self { if includeElement(e) { ret += e } } return ret } } var a

鉴于此代码

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

我认为,定义不明确的方法没有问题。当您从不同的模块导入两个模糊的方法时,就会出现问题。遗憾的是,无法排除导入的
数组.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}"

好问题。仅我的2美分:即使在Objective-C中,使用category重写现有方法也可能导致UB,对吗?也许斯威夫特对此有增援?如果我错了,请纠正我。@Unheilig是的,这是ObjC中的UB。但这有点不同。它仍然允许我添加(而不是重写)同名的新方法。但不允许我这么说。想象一下一些已经编译过的库已经使用了
过滤器
方法,我认为它仍然可以使用默认的方法(假设swift使用静态分派调用它)。在
过滤器
上做了很好的检测工作!别忘了提交错误报告。
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}"