统一Swift中的数组和数组切片

我是 Swift的新手,也是Apple编程的新手.我写了这段代码来进行二分查找.

func binarySearch<X:Comparable> (needle:X,haystack:[X])->X? {
    if haystack.isEmpty { return nil }
    let mid = haystack.count / 2
    let found = haystack[mid]
    if found == needle {
        return needle
    }
    else if found < needle {
        return binarySearch(needle,haystack[0..<mid])
    }
    else {
        return binarySearch(needle,haystack[mid+1..<haystack.count])
    }
}

我在递归调用上遇到语法错误,因为第二个参数的类型是ArraySlice< X>而不是Array< X>.

我通过使用相同的版本重载binarySearch来解决这个问题,除了第二个参数是ArraySlice< X>类型.

如果它可以在一个函数中完成,我认为它会更优雅.是否有合适的类型统一Array和ArraySlice?我尝试使用ArrayLiteralConvertible< X>但由于某些原因,没有计数成员.我在文档中找到自己的方法仍然有点麻烦,所以我可能很容易忽略一个更好的选择.

你能建议一个方法吗?如果它涉及使用内置类,你可以给我一个关于如何为自己下次找到它的提示,而不是写给SO吗?

解决方法

是的,Array / ArraySlice很烦人.您需要的基本通用要求详见 this问题.但是,为了满足您的要求,不幸的是,您必须获得一些非常可怕的功能签名.但是有可能:

func bSearch<
  S : Sliceable where S.SubSlice : Sliceable,S.SubSlice.Generator.Element == S.Generator.Element,S.SubSlice.SubSlice == S.SubSlice,S.Generator.Element : Comparable,S.Index : IntegerArithmeticType,S.Index : IntegerLiteralConvertible,S.SubSlice.Index == S.Index
  >(el: S.Generator.Element,list: S) -> S.Generator.Element? {

    if list.isEmpty { return nil }

    let midind = list.endindex / 2

    let midEl: S.Generator.Element = list[midind] // type inference giving me some bugs here

    if midEl == el {
      return el
    }

    return midEl < el ?
      bSearch(el,list: list[midind+1..<list.endindex]) :
      bSearch(el,list: list[0..<midind])
}

而对于Swift 1.2,只需更换机身:

if isEmpty(list) { return nil }

let midind = list.endindex / 2

let midEl: S.Generator.Element = list[midind] // type inference giving me some bugs here

if midEl == el {
  return el
}

return midEl < el ?
  bSearch(el,list[midind+1..<list.endindex]) :
  bSearch(el,list[0..<midind])

相关文章

软件简介:蓝湖辅助工具,减少移动端开发中控件属性的复制和粘...
现实生活中,我们听到的声音都是时间连续的,我们称为这种信...
前言最近在B站上看到一个漂亮的仙女姐姐跳舞视频,循环看了亿...
【Android App】实战项目之仿抖音的短视频分享App(附源码和...
前言这一篇博客应该是我花时间最多的一次了,从2022年1月底至...
因为我既对接过session、cookie,也对接过JWT,今年因为工作...