在 Swift 中,您可以使用范围运算符获取数组的切片,如下所示:
let list: String[] = ["first", "middle", "last"]
let cdr = list[1..list.endIndex]
assert(cdr == ["middle", "last"])
我正在尝试在递归函数中做同样的事情,该函数需要String[]
参数,但没有任何运气:
func last(xs: String[]) -> String? {
switch xs {
case let (singleItemList) where singleItemList.endIndex == 1:
return singleItemList[0]
case let(multiItemList) where multiItemList.endIndex > 1:
let cdr: String[] = multiItemList[1..multiItemList.endIndex] // compilation error!
return last(cdr)
default:
return nil // empty list
}
}
last(["first", "middle", "last"])
last(["last"])
last([])
中间的 case 语句无法编译。它因以下错误而失败:
Playground execution failed: error: <REPL>:14:29: error: could not find an overload for 'subscript' that accepts the supplied arguments
let cdr: String[] = multiItemList[1..multiItemList.endIndex] // compilation error!
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
难道我做错了什么?是我获取的值的类型let
不知何故不是String[]
?
我正在尝试提出一个等效的递归last
Scala 中的方法(是的,我知道有更简单的方法可以将最后一个元素内置到 Swift 和 Scala):
def last[T](xs: List[T]): T = xs match {
case List() => throw new Error("last of empty list")
case List(x) => x
case y :: ys => last(ys)
}