当前位置: 首页 > 面试题库 >

为什么不能在switch语句中使用元组常量作为大小写

左丘耀
2023-03-14
问题内容

我决定使用Swift的case语句和元组。它看起来像是该语言的较酷功能之一。

我决定玩月/日/年元组。令我惊讶的是,我不能在switch语句中使用常量元组值作为案例。这是一个示例(可以粘贴到Playground中并运行)

import UIKit
typealias mdyTuple = (month: Int, day: Int, year: Int)
let joesBirthday: mdyTuple = (month: 6, day: 7, year: 1978)
let someday: mdyTuple = (6, 7, 1978)

switch someday
{
  //---------
  //The line "case joesBirthday" won't compile.
  //case joesBirthday:
  //  println("Joe was born on this day"
  //---------
case (joesBirthday.month, joesBirthday.day, joesBirthday.year):
  println("Joe was born on this day")
case (joesBirthday.month, joesBirthday.day, let year):
  println("Joe is \(year-joesBirthday.year) today")
default:
  println("Some other day")
}

注释掉的代码case joesBirthday:不会编译(如果重要的话,在Xcode
6.3中)。在下面的情况下(我分别列出了joesBirthday元组的所有元素)更难键入且更难阅读,确实可以工作)

键入此命令时,我的Playground崩溃了Xcode,再次尝试重新启动Xcode时崩溃了,所以我在报告错误代码时遇到了麻烦。

好的,我终于让Xcode停止崩溃了(连续崩溃4次之后。Yayyy!)。错误是“二进制运算符~=不能应用于两个mdyTuple操作数。”

为什么要尝试使用~=操作数?不喜欢元组相等吗?

是否有一些 干净的 替代语法可以让我在switch语句中使用常量元组?


问题答案:

您可以~=为以下mydTuple类型实现运算符:

func ~=(a: mdyTuple, b: mdyTuple) -> Bool {
    return a.month ~= b.month && a.year ~= b.year && a.day ~= b.day
}

在操场上对我有用…现在,这段代码

switch someday {
case joesBirthday:
    println("one")
default:
    println("two")
}

打印“一个”。

这是运算符的定义:

infix operator ~= {
    associativity none
    precedence 130
}

并实现以下目的:

/// Returns `true` iff `pattern` contains `value`
func ~=<I : IntervalType>(pattern: I, value: I.Bound) -> Bool
func ~=<T>(lhs: _OptionalNilComparisonType, rhs: T?) -> Bool
func ~=<T : Equatable>(a: T, b: T) -> Bool
func ~=<I : ForwardIndexType where I : Comparable>(pattern: Range<I>, value: I) -> Bool


 类似资料:
  • 问题内容: 为什么下面的代码: 给出错误: 在循环外继续 问题答案: 失败是switch语句的标准行为,因此,在switch语句中使用Continue没有意义。Continue语句仅在for / while / do..while循环中使用。 根据我对您意图的理解,您可能想写: 我还建议您将默认条件放在最后。 编辑:continue语句不能在switch语句中使用并不完全正确。(带有理想标记的)

  • 问题内容: 我只是想知道为什么Java 7 语句不支持大小写而是抛出?请参见下面的注释行(示例摘自上的Java教程文章): 这样可以避免每次使用前都进行空检查的条件。 问题答案: 正如damryfbfnetsi 在评论中指出的那样,JLS§14.11具有以下注释: 禁止将其用作开关标签,以防止他人编写永远无法执行的代码。如果表达式是引用类型,即装箱的原始类型或枚举类型,则如果表达式在运行时求值为,

  • 问题内容: 此功能是否将在以后的Java版本中使用? 有人可以解释为什么我不能这样做吗,就像Java 语句起作用的技术方式一样? 问题答案: 带有案例的switch语句已在Java SE 7中实现,至少在首次提出要求后的 16年。没有提供延迟的明确原因,但可能与性能有关。 在JDK 7中实现 现在,该功能已 通过“脱糖”过程实现。在声明时使用常量的干净,高级语法在编译时扩展为遵循模式的更复杂的代码

  • 问题内容: 我试图做这样的事情,即在switch语句中使用数组。Java可能吗?如果不是,请说明可能的解决方案。 问题答案: 不 ,您根本不能。 表达式的类型必须是char,byte,short,int,Character,Byte,Short,Integer,String或枚举类型(第8.9节),否则会发生编译时错误。 http://docs.oracle.com/javase/specs/jl

  • 问题内容: 最近,我一直对机器学习感兴趣,尤其是对图像的机器学习,但是要做到这一点,我需要能够处理图像。我想对图像处理库在此过程中的工作方式有更全面的了解,因此我决定创建自己的库来读取我能理解的图像。但是,在读取图像的 大小 时似乎遇到了一个问题,因为在尝试编译时会弹出此错误: 这是我的代码: 我刚刚开始使用Go进行编程,所以很抱歉,如果这个问题听起来不行, 问题答案: 因为Go是一种静态类型的语

  • 问题内容: 以下Java代码无法编译。 为什么?在没有先声明的情况下,没有代码路径可导致程序将1分配给该路径。 我想到的范围可能仅限于第一条陈述,但后来我不明白为什么。如果我真的不想不必要地声明以提高性能怎么办?我不喜欢声明后不使用变量。 (您可能想争论一下,我不可以在第二条语句中简单地声明b ,在这种情况下,请想象一下它可能在其他地方处于循环中。) 问题答案: 为什么?如果没有先声明,没有代码路