鉴于此代码
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被破坏,它为每个元素调用两次闭包并崩溃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
解决方法
我认为定义含糊不清的方法没有问题.从不同模块导入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}"
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。