有没有办法在 swift 中包含通配符的数组上使用 switch?
Is there a way to use switch on an array that includes wildcards in swift?
我想这样做:
var arr = [0,1,0,1,0,2,1,0,0]
switch arr {
case [1,_,_,_,_,_,_,_]: print("Yay")
default: print("Nay")
}
但我收到此错误:“'_' 只能出现在模式中或赋值的左侧”
我搜索了此错误消息和“通配符 swift 数组切换语句”,似乎无法在此上下文中使用通配符,但使用 [= 可能有某种解决方法33=] 涉及到 ~=.然而,这超出了我目前的知识范围,我还没有找到一个与我完全一样的案例,而且似乎有相当多的暗示担心运算符重载出于某种原因是不好的。另外,我发现的例子有点像我的案例,看起来很复杂。我是一个自学成才的业余爱好者,只是想拼凑一个基本的应用程序来让我的工作生活更轻松,所以对于任何愚蠢的问题我深表歉意,但我想更好地理解以下内容:
为什么我不能在此上下文中使用通配符?由于某种原因,它们似乎使用元组而不是数组,我不明白为什么一个可以工作而另一个不能。
操作重载实际上是'bad'并且是否有相对直接的方法来实现此功能?
如果没有-有人可以推荐另一种方法吗?我选择这种方法是因为我有两个数组,一个用于一系列问题,一个用于记录对每个问题的回答。我想实现相当复杂的逻辑,其中对先前问题的响应的配置将决定接下来提出哪个问题(下面的示例)。在意识到我需要一种更简洁的方法之前,我浪费了大量时间淹没在令人费解的 'if' 语句中,而这似乎就是它。但是,如果没有通配符或类似的东西,明确定义每种情况是不切实际的。在这种情况下有人可以推荐不同的方法吗?显然,这是一个精简的例子,还会有更多定义的案例。提前致谢。
var responseArr = [0,2,1,2,1,0,0] // 0 = unasked, 1 = asked answered no, 2 = asked answered yes
switch responseArr {
case: [0,_,_,2,1,0,_]: nextQuestion = questionArr[0] // If 'yes' to question 4, no to question 5, and questions 1 and 6 were not asked yet, ask question 1
case: [1,_,_,2,1,0,_]: nextQuestion = questionArr[5] // If 'yes' to question 4, no to question 5, no to question 1, and question 6 was not asked yet, ask question 6
...
default: print("error")
}
It seems like they work with tuples but not arrays for some reason
原因是元组是多值类型,每个值都是单独计算的,另一方面数组是一个个值。
有效的语法是
switch arr {
case arr where arr[0] == 0 && arr[5] == 2 : print("Yay")
default: print("Nay")
}
元组语法类似于
switch (arr[0], arr[1], arr[2], arr[3], arr[4], arr[5], arr[6], arr[7], arr[8]) {
case (0,_,_,2,1,0,_,_,_): print("Yay")
default: print("Nay")
}
Joakim 和 vadian 的回答在很大程度上暗示了这一点,但为了其他可能遇到此问题的初学者的利益 - 数组到元组的非常简单的转换(如下所示)似乎非常适合我的工作试图首先完成,只需要添加一个中间变量并将一些括号替换为圆括号:
var arr2 = [0,1,0,1,0,2,1,0,0]
let arr2AsTuple = (arr2[0],arr2[1],arr2[2],arr2[3],arr2[4],arr2[5],arr2[6],arr2[7],arr2[8])
switch arr2AsTuple {
case (1,_,_,_,_,_,_,_,_): print("Yay")
default: print("Nay")
}
我想这样做:
var arr = [0,1,0,1,0,2,1,0,0]
switch arr {
case [1,_,_,_,_,_,_,_]: print("Yay")
default: print("Nay")
}
但我收到此错误:“'_' 只能出现在模式中或赋值的左侧”
我搜索了此错误消息和“通配符 swift 数组切换语句”,似乎无法在此上下文中使用通配符,但使用 [= 可能有某种解决方法33=] 涉及到 ~=.然而,这超出了我目前的知识范围,我还没有找到一个与我完全一样的案例,而且似乎有相当多的暗示担心运算符重载出于某种原因是不好的。另外,我发现的例子有点像我的案例,看起来很复杂。我是一个自学成才的业余爱好者,只是想拼凑一个基本的应用程序来让我的工作生活更轻松,所以对于任何愚蠢的问题我深表歉意,但我想更好地理解以下内容:
为什么我不能在此上下文中使用通配符?由于某种原因,它们似乎使用元组而不是数组,我不明白为什么一个可以工作而另一个不能。
操作重载实际上是'bad'并且是否有相对直接的方法来实现此功能?
如果没有-有人可以推荐另一种方法吗?我选择这种方法是因为我有两个数组,一个用于一系列问题,一个用于记录对每个问题的回答。我想实现相当复杂的逻辑,其中对先前问题的响应的配置将决定接下来提出哪个问题(下面的示例)。在意识到我需要一种更简洁的方法之前,我浪费了大量时间淹没在令人费解的 'if' 语句中,而这似乎就是它。但是,如果没有通配符或类似的东西,明确定义每种情况是不切实际的。在这种情况下有人可以推荐不同的方法吗?显然,这是一个精简的例子,还会有更多定义的案例。提前致谢。
var responseArr = [0,2,1,2,1,0,0] // 0 = unasked, 1 = asked answered no, 2 = asked answered yes switch responseArr { case: [0,_,_,2,1,0,_]: nextQuestion = questionArr[0] // If 'yes' to question 4, no to question 5, and questions 1 and 6 were not asked yet, ask question 1 case: [1,_,_,2,1,0,_]: nextQuestion = questionArr[5] // If 'yes' to question 4, no to question 5, no to question 1, and question 6 was not asked yet, ask question 6 ... default: print("error") }
It seems like they work with tuples but not arrays for some reason
原因是元组是多值类型,每个值都是单独计算的,另一方面数组是一个个值。
有效的语法是
switch arr {
case arr where arr[0] == 0 && arr[5] == 2 : print("Yay")
default: print("Nay")
}
元组语法类似于
switch (arr[0], arr[1], arr[2], arr[3], arr[4], arr[5], arr[6], arr[7], arr[8]) {
case (0,_,_,2,1,0,_,_,_): print("Yay")
default: print("Nay")
}
Joakim 和 vadian 的回答在很大程度上暗示了这一点,但为了其他可能遇到此问题的初学者的利益 - 数组到元组的非常简单的转换(如下所示)似乎非常适合我的工作试图首先完成,只需要添加一个中间变量并将一些括号替换为圆括号:
var arr2 = [0,1,0,1,0,2,1,0,0]
let arr2AsTuple = (arr2[0],arr2[1],arr2[2],arr2[3],arr2[4],arr2[5],arr2[6],arr2[7],arr2[8])
switch arr2AsTuple {
case (1,_,_,_,_,_,_,_,_): print("Yay")
default: print("Nay")
}