在Swift switch语句中使用`let`编译错误

Ted*_*eid 2 swift

在Swift中,您可以使用范围运算符获取一个数组,如下所示:

let list: String[] = ["first", "middle", "last"]
let cdr = list[1..list.endIndex]
assert(cdr == ["middle", "last"])
Run Code Online (Sandbox Code Playgroud)

我试图在一个带有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([])
Run Code Online (Sandbox Code Playgroud)

中间案例语句不编译.它失败并出现此错误:

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!
                            ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Run Code Online (Sandbox Code Playgroud)

难道我做错了什么?我从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)
}
Run Code Online (Sandbox Code Playgroud)

Pat*_*ens 6

multiItemList[1..multiItemList.endIndex]不是数组.您必须先将其转换为数组.将行更改为以下内容:

let cdr: String[] = Array(multiItemList[1..multiItemList.endIndex])
Run Code Online (Sandbox Code Playgroud)

  • 实际类型是`String [] .SliceType`又是`Slice <String>`. (3认同)