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}"