加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

swift – 如何调用模糊方法?

发布时间:2020-12-14 04:57:17 所属栏目:百科 来源:网络整理
导读:鉴于此代码 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} 它无法编译错误消息 e
鉴于此代码

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读