gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 00:24:37 28 4
gpt4 key购买 nike

在 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)
}

最佳答案

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

let cdr: String[] = Array(multiItemList[1..multiItemList.endIndex])

关于swift - 在 Swift switch 语句中使用 `let` 编译错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24100707/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com