Swift:Switch 语句失败行为

2024-04-24

目前我有这个:

let somePoint = (1, 0)

switch somePoint {
case (0,0):
    print("origin") // does not print
    fallthrough
case (_, 0):
    print("y-axis") // prints y-axis. this makes sense
    fallthrough
case(0, _):
    print("x-axis") // prints x-axis (because of fallthrough? this should not print)
    fallthrough
case(-2...2, -2...2):
    print("in 5x5 box about the origin") // this prints and makes sense
default:
    print("somewhere else") // does not print
}

我使用此 switch 语句的目标是打印每个案例(如果为真),而不是仅打印第一个匹配的案例。我想我可以用fallthrough声明来做到这一点。然而,这让我质疑它是如何运作的。为什么即使大小写不匹配,fallthrough 也会自动打印行中的下一个大小写?我怎样才能让这个 switch 语句按照我想要的方式工作?


Fallthrough落入下一个案例,而不是下一个匹配的案例。这个概念继承自Cswitch语句,其中每个case可能被认为是goto目的地标签,以及switch语句将执行到第一个匹配的语句。

在C中,switch语句仅指示执行位置starts块内。为了更加方便,您may使用break声明跳过其余部分switch身体,但没有什么强迫你;如果你不这样做,执行会正常继续,就像cases 不在那儿。例如:

switch (countdown)
{
    case 3: puts("3...");
    case 2: puts("2...");
    case 1: puts("1...");
    case 0: puts("0!");
}

With no break任何地方,如果countdown是 3,那么你就得到了整个事情(即使countdown显然是 3,而不是 2、1 或 0)。

当执行从一个案例转到另一个案例而不是退出时switch范围(例如,具有break声明),你会得到“fall through”(这就是 Swiftfallthrough关键字确实如此)。

这在 C 中是相关的,因为您可以在内部使用任意复杂的结构switch语句,如果需要的话可以重叠案例。这是一个合法的 C 程序:

switch (x)
{
    case 0:
        if (y == 3)
        {
    case 1:
            puts("hello");
        }
        else
        {
            puts("world");
        }

    case 2:
        puts("!");
}

然而,这种用法极其罕见,并且通常很难遵循(快点!如果出现以下情况,可以执行 else 分支吗?x == 1?)。我还没有测试过,但如果你能用 Swift 做类似的事情,我会感到非常惊讶。

一般来说,在 C 中,跌倒被认为是糟糕的风格,因为通常很难判断跌倒是自愿的还是由于缺失break陈述。 Swift 解决了这个问题fallthrough语句,这明确表明您希望执行继续到语句中的下一个情况switch声明而不是退出switch scope.

在您的情况下,您不能使用fallthrough来获得您想要的东西,因为fallthrough仅当您需要的执行序列是线性时才有用。您需要跳过无效的代码块,因此您需要使用if-else序列而不是switch陈述。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Swift:Switch 语句失败行为 的相关文章

  • 使用 AlamofireImage 下载图像有进度吗?

    有没有办法使用 AlamofireImage 下载图像并获得有关下载进度的某种反馈 同时利用它的强大功能UIImage 扩展 图像过滤器和图像缓存 我知道我可以退回到平原Alamofire request responseImage但我想让
  • 当 tableView 向下滑动时显示 UISearchController

    我通过 UISearchController 在我的测试应用程序中实现了搜索栏 当我启动应用程序时 我会在导航控制器下方看到搜索栏 但如何在应用程序启动时隐藏它并仅在下拉表格视图时显示它 并在拉出表格视图时再次隐藏 我在google或you
  • 为什么removeAllObservers()在deinit中不起作用?

    众所周知 在 iOS 中使用 Firebase 的强大功能时 每当您在视图控制器中进行观察时 var o DatabaseReference var o2 DatabaseReference var o3 DatabaseReference
  • UIScrollView 滚动时捕捉到位置

    我正在尝试实现一个捕捉到点的滚动视图滚动时 我在这里看到的所有帖子都是关于在用户结束拖动滚动条 之后 捕捉到某个点的 我想让它在拖动过程中折断 到目前为止 我已经用它来停止拖动后的惯性 并且效果很好 func scrollViewWillE
  • 如何使用 Parse 和 Swift 从 Facebook 注销或撤销登录

    我正在尝试将我的用户完全从我的应用程序中注销 使用时 PFUser logout 我成功地将用户从 Parse 中注销 但是 当我返回应用程序并单击登录按钮时 我被重定向到 Facebook 屏幕 显示 您已经授权 应用程序名称 所以我永远
  • “GTLDriveFile”类型的值没有成员“downloadUrl”

    我正在关注这个tutorial https developers google com drive ios devguide files我正在尝试用 Swift 来做这件事 The file对象没有downloadUrl财产 我不明白为什么
  • 支持从右到左的纯布局

    iOS纯布局支持从右到左的语言吗 我们如何在阿拉伯语言的代码中实现它 而不需要去设置并选择区域和格式语言 Thanks 您可以通过在 Xcode gt 编辑方案 gt 运行 gt 选项 选项卡 gt 应用程序语言 gt 从右到左伪语言中选择
  • Swift TTS,无音频输出

    我尝试在我的应用程序 TTS 中集成 但如果单击按钮 则没有音频输出 这是按钮代码 struct VocabDetailView View var body some View HStack Button Play readOut text
  • 如何快速将 Int16 转换为两个 UInt8 字节

    我有一些二进制数据 将两个字节值编码为有符号整数 bytes 1 255 0xFF bytes 2 251 0xF1 Decoding 这相当简单 我可以提取一个Int16这些字节的值 Int16 bytes 1 lt lt 8 Int16
  • Swit 中的函数式编程将数组元素分配到正确的“桶”

    我是函数式编程的新手 我的问题是我有一个主数组和固定数量的 目标 数组 我想根据每个元素的特定值将主数组中的元素分配到正确的结果数组中 我猜测一种方法是使用一个映射函数来遍历主数组元素 确定正确的 目标数组 值 基于某种逻辑 然后将元素添加
  • 如何正确设置 UIBezierPath 的动画以产生水/波浪效果?

    我正在尝试做一个UIBezierPath像波浪或水一样动画 类似于这样的事情 https dribbble com shots 3994990 Waves Loading Animation https dribbble com shots
  • iOS 13.x 中的重复/自动反转动画

    以前在 swift 中你可以这样做 let animator UIViewPropertyAnimator duration 0 25 curve easeIn UIView setAnimationRepeatCount Float in
  • Swift 4 使用随机密钥解码嵌套 JSON [重复]

    这个问题在这里已经有答案了 我是 Swift 4 的新手 正在尝试从 Wikipedia API 解码此 JSON 我正在努力定义一个结构 因为我发现的所有示例 教程都仅嵌套 1 2 层深度 除此之外 当其中一个密钥是随机的时 如何解码数据
  • 禁用将应用程序窗口置于前面。关闭另一个窗口后

    我有包含 2 个 NSWindowController 的 OSX 应用程序 我的问题可以通过以下几个步骤来描述 使用 2 个窗口启动应用程序 选择另一个应用程序的窗口 将其中一个窗口放在另一个应用程序窗口前面 第二个窗口将保留在底部 关闭
  • 为什么在快速合并两个视频或更改背景音乐后视频变成黑屏?

    在我的 ios 应用程序中 我想合并两个视频并更改背景音乐 我尝试过 对于普通视频来说效果很好 但是 当我选择任何延时视频 然后尝试合并或更改背景音乐时 视频变成全黑屏 对于我的应用程序 我使用 swift 4 2 和 xcode 10 我
  • Xcode 6 代码编辑器异常行为

    截至最近 我在使用 Xcode 6 代码编辑器时遇到了一些麻烦 最终导致编辑窗口中的焦点快速变化 在编辑文本时跳转到同一文件中完全不同的位置 一切就是这样开始的 最近 编辑器拒绝上下滚动 挂起 停止显示行号或任何其他文本 我该怎么做才能让它
  • Swift:转义闭包捕获非转义参数“onCompletion”

    我的 swift 有问题 我正在尝试发送 API 请求 然后检索数据 但收到以下错误消息 Swift 转义闭包捕获非转义参数 onCompletion 有谁知道我该如何解决这个问题 提前致谢 Code class RestApiManage
  • 移动文件并覆盖[重复]

    这个问题在这里已经有答案了 即使同名文件已存在 我也尝试移动文件 NSFileManager moveItemAtURL location1 toURL location2 Does NSFileManager的方法moveItemAtUR
  • iOS 意外的平台状况(预期的“os”、“arch”或“swift”)-可达性

    我刚刚更新了我的 pod 更新后Reachability导致错误 意外的平台状况 预期的 os arch 或 swift I tried to build and clean but it does not work what s the
  • 在 Swift 中使用 Obj-C 完成块

    在 Objective C 中 我有一个完成块类定义为 File h typedef void MYCompletionBlock BOOL success NSDictionary result NSError error 然后 在 Sw

随机推荐

  • .NET 4 中的 TaskCreationOptions.DenyChildAttach

    我在 NET 4 5 中看到Task Run 相当于 Task Factory StartNew someAction CancellationToken None TaskCreationOptions DenyChildAttach T
  • C 中的 UTF8 处理

    我对UTF8有基本的了解 码点的长度是可变的 所以一个 字符 可以是8位 16位 甚至更长 我想知道 C 语言中是否有一些示例代码 库等可以与 UTF8 字符串 如 C 中的标准库 执行类似的操作 告诉字符串的长度等 Thanks GNU
  • 分配内存空间的宏

    我需要让一个汇编程序员来计算帕斯卡三角形 https en wikipedia org wiki Pascal 27s triangle 这样帕斯卡三角形的每一行都与其他行分开存储在内存中 我想做一个 但我不知道如何使用宏在汇编中做到这一点
  • SwiftUI:为什么 ForEach($strings) (文本:Binding)无法构建?

    我有一个ForEach它需要一个 Binding 并使用 Xcode11 beta5 编译 但使用 beta6 则显示Type of expression is ambiguous without more context on the T
  • sed 替换文字 TAB

    我想更换TABs in stdout带分号 通过运行sed来自 ZSH shell 我知道通常可以 在其他 shell 中 使用 somecommand sed s t g 然而 这在 FreeBSD 下的 ZSH shell 中对我不起作
  • DynamicDataDisplay ChartPlotter 删除所有绘图

    在我的 WPF 应用程序中 我有一个 D3 ChartPlotter 可以在其中绘制 4 个折线图 这是 XAML 代码
  • Objective-C 类是否可以在 .h 中实现 swift 协议

    是否有可能Objective C类来实现Swift协议中的 h以便其他Swift类可以参考Objective C类由Swift协议类型 Let MySwiftProtocol be the Swift协议类型 现在假设我有这个 h对于我的班
  • Apache 错误:地址已在使用中:make_sock:无法绑定到地址 [::]:443

    Apache 启动时出错 Address already in use make sock could not bind to address 443 Executing start method lib svc method http a
  • Spring安全和特殊字符

    我需要通过 url 在用户名和 或密码中使用特殊字符使用 j spring security check 登录 http localhost 8080 appname j spring security check j username u
  • 在 R 中解析和评估字符串表达式的列?

    如何将 R 中的一列字符串表达式作为管道的一部分进行解析和求值 在下面的示例中 我生成了所需的列 evaluated 但我知道这不是正确的做法 我尝试采取 tidyverse 方法 但我只是很困惑 library tidyverse df
  • 如何在 Docker SQL Server 映像上运行安装脚本?

    我正在尝试在 Docker SQL Server 映像上运行安装脚本 为此 我从 mssql 映像创建了一个 Dockerfile FROM microsoft mssql server linux 2017 CU8 Create dire
  • 有没有好的 AS3 代码片段/示例的指针?

    我是 AS3 的新手 每天都在学习 我正在寻找好的 AS3 代码片段 示例 小项目 我可以将其用于学习目的和参考 不依赖于 Flash IDE 因为我使用 Flex SDK 和 Flash Develop 此外 我还专门寻找有关音频 视频流
  • jQuery/AJAX - 单击按钮时将内容加载到 div 中?

    有人可以在这里提供帮助吗 我想填充一个div 例如 div div 包含来自外部文件的内容 例如 includes about info html 当单击某个类别的按钮时 例如 p class classloader Click Here
  • 保存实体会导致重复插入到查找数据中

    我使用 EF 4 1 代码优先 来创建我的数据库和对象 Given public class Order public int Id get set public string Name get set public virtual Ord
  • 绕过 InAppBrowser Cordova 插件中的 SSL 错误

    我已在 Cordova 项目中添加了一个 InAppBrowser 插件来访问站点并获取令牌 但是虽然该站点在桌面浏览器中正常打开 但从移动浏览器打开时却出现错误 此外 默认的本机浏览器会在出现 SSL 错误时要求继续 但 Cordova
  • 微软动态 - Web API

    我正在尝试通过 Web API 在 Dynamics 365 实例中创建一个新的 事件 案例 在我的http请求中 我不知道哪个字段是必填的 我尝试仅添加标题 主题和客户 但返回 Http 400 错误 我正在使用 Postman 尝试我的
  • 为什么 console.dir('') 打印“无属性”?

    我的印象是字符串具有属性 例如match 为什么console dir 声称 没有属性 至少在 Google Chrome 中 这是因为 是一个字符串文字 而不是一个实例String 班级 由于属性如match宣布于String proto
  • 双击 Selenium 的 javascript 执行

    有一种方法可以通过执行 javascript 来单击元素 如下所示 JavascriptExecutor driver executeScript arguments 0 click element 我想通过执行 JavaScript 来双
  • 允许在 Google 计算引擎 (GCE) 中使用 WebSocket

    我正在使用计算引擎 GCE 通过 Socket IO Node js 运行我的套接字服务器 它仅适用于轮询 当我尝试使用网络客户端时 我收到以下错误代码 WebSocket connection to ws myapp socket app
  • Swift:Switch 语句失败行为

    目前我有这个 let somePoint 1 0 switch somePoint case 0 0 print origin does not print fallthrough case 0 print y axis prints y