swift 4:将对象与元组进行模式匹配(元组模式无法匹配非元组类型的值)

2024-01-12

我有一个带有几个字段的自定义结构,我想快速对其进行模式匹配switch语句,以便我可以通过将其中一个字段与正则表达式进行比较来自定义匹配。

例如。鉴于此结构:

struct MyStruct {
    let header: String
    let text: String
}

I'd like像这样的模式匹配:

switch(someInstance) {
    case ("h1", "[a-z]+"): ...
    case ("h1", "0-9+"): ...
}

我尝试使用模式匹配函数来使其工作,如下所示:

func ~=(pattern: (String, String), value: MyStruct) -> Bool {
    return value.header == pattern.0 && value.text.range(of: pattern.1, options: .regularExpression) != nil
}

但是 Xcode (9) 无法编译并出现以下错误:

元组模式无法匹配非元组类型“MyStruct”的值

我能够实现的最好成绩如下:

struct MatchMyStruct {
    let header: String
    let regex: String

    init(_ header: NSString, _ regex: String) {
        self.header = header
        self.regex = regex
    }
}

func ~=(pattern: MatchMyStruct, value: MyStruct) -> Bool {
    return value.header == pattern.header && value.text.range(of: pattern.regex, options: .regularExpression) != nil
}

这让我可以像这样进行模式匹配:

switch(someInstance) {
    case MatchMyStruct("h1", "[a-z]+"): ...
    case MatchMyStruct("h1", "0-9+"): ...
}

虽然这是功能性的,但我更不想拥有MatchMyStruct像这样明确的包装器。

似乎 Swift 有一些神奇的秘密武器可以与阻碍的元组进行模式匹配。我在这里可以做些什么吗?


您可以创建一个计算属性来返回一个元组:

struct MyStruct {
    let header: String
    let text: String

    var tuple: (String, String) { return (header, text) }
}

然后你就可以switch根据tuple计算属性:

switch(someInstance.tuple) {
case ("h1", "[a-z]+"):
    ...
case ("h1", "0-9+"):
    ...
default:
    ...
}

或者,如果您的目的是执行正则表达式匹配:

switch(someInstance.tuple) {
case ("h1", let string) where string.range(of: "^[a-z]+$", options: .regularExpression) != nil:
    print("alphabetic")
case ("h1", let string) where string.range(of: "^[0-9]+$", options: .regularExpression) != nil:
    print("numeric")
default:
    print("other")
}

或者,如果这太拗口了,您可以定义一些用于正则表达式模式匹配的字符串函数,例如:

extension String {
    func isMatch(regex pattern: String) -> Bool {
        return range(of: "^" + pattern + "$", options: .regularExpression) != nil
    }
    func contains(regex pattern: String) -> Bool {
        return range(of: pattern, options: .regularExpression) != nil
    }
}

进而:

switch(someInstance.tuple) {
case ("h1", let string) where string.isMatch(regex: "[a-z]+"):
    print("alphabetic")
case ("h1", let string) where string.isMatch(regex: "[0-9]+"):
    print("numeric")
default:
    print("other")
}

或者按照你想要的方式执行此操作,但这只是为了说明如果你想要元组匹配,你可以定义计算属性来返回元组,然后在where条款。

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

swift 4:将对象与元组进行模式匹配(元组模式无法匹配非元组类型的值) 的相关文章

  • 收到 fcm 推送通知时设置应用程序徽章

    我正在使用 FCM 进行云消息传递 当我在后台和前台应用程序状态下收到来自服务器的推送通知时 我想添加应用程序徽章 我缺少什么 主要问题是根据推送通知添加 更新 删除应用程序徽章 我可以接收和处理推送消息 我在这个问题上花了 3 天 请帮帮
  • PreferredStatusBarStyle 不起作用[重复]

    这个问题在这里已经有答案了 我以前用过setStatusBarStyle在我的项目中 它工作正常 但它已被弃用 所以我使用preferredStatusBarStyle 那不起作用 知道我已经 调用方法setNeedsStatusBarAp
  • UIWindow.makeKeyAndVisible() 在 XCTest 中抛出“props 必须具有有效的 clientID”错误

    我正在 Xcode 中使用 XCTest 测试 UIViewController 为了测试一些导航和警报功能 我需要将视图控制器放在 UIWindow 中 我使用以下代码执行此操作 let myViewController UIViewCo
  • 在 Swift 中在地图上显示路线

    我试图在苹果地图上绘制两点之间的路线 Swift 代码 下面的结构体用于存储坐标 struct GeoLocation var latitude Double var longitude Double func distanceBetwee
  • 在 iOS Swift 中将 NSDate 转换为字符串 [重复]

    这个问题在这里已经有答案了 我正在尝试转换NSDate to a String然后更改格式 但当我经过NSDate to String它正在产生空白 let formatter DateFormatter let myString Stri
  • 三元运算符结合性

    我无法理解三元运算符上下文中的结合性概念 在大多数情况下 三元运算符如下所示 a b c 在这种情况下 不需要结合性来计算表达式 但有时 三元运算符是嵌套的 a b c d e a b c d e is right associative
  • 使用 Cuda 并行读取多个文本文件

    我想使用 CUDA 在多个文件中并行搜索给定字符串 我计划使用 pfac 库来搜索给定的字符串 问题是如何并行访问多个文件 示例 我们有一个包含 1000 个文件的文件夹 需要搜索 这里的问题是我应该如何访问给定文件夹中的多个文件 应该动态
  • 是否可以禁用用户按下通知横幅时打开应用程序的机制?

    使用iOS13 4 XCode11 4 Swift5 2 在我当前的应用程序中 我成功地创建了本地通知 发生通知时会显示横幅 横幅的显示与应用程序状态无关 即打开的应用程序在前台或后台运行 或者即使应用程序完全关闭 到目前为止 一切都很好
  • iOS 中如何将阴影变成圆形?

    我创建了一个圆形 UIView 它也应该有一个阴影 到目前为止 一切正常 但在角落 阴影没有正确倒圆 如何将阴影角变圆 这是代码和屏幕截图 popupView layer cornerRadius 15 popupView layer sh
  • 新行命令 (\n) 不适用于 Firebase Firestore 数据库字符串

    我正在使用 Swift 制作一个应用程序 并且正在使用 Firebase Firestore Firestore 是一个数据库 其中有一些我放入的字符串UILabel 对于我的一些字符串 我使用新行命令 或 n 所以我的一些字符串看起来像这
  • UICollectionView 组合布局 - iPad 旋转时项目大小未正确更新

    我有一个目前无法解决的问题 即我正在尝试根据 iPad 位置在集合视图中设置不同数量的列 集合应在设备旋转时更新 目前 取决于设备在开始时的定位方式 第一次旋转项目的宽度未正确计算 iPad屏幕 https i stack imgur co
  • 快速更改 uiviewcontroller 的视图

    我创建一个新的UIViewController 我不使用故事板 这是我的代码 我想更改我的视图框架 这对我不起作用 我尝试添加viewWillAppear 还是不行 我知道我可以添加一个新的UIView去做吧 我可以更改视图控制器的视图吗
  • Swift IOS,如何将应用程序用户输入的句子的字母大写,示例;第四个字母和第六个字母?

    用户在文本字段中输入一个句子 然后在一个文本字段中输入数字 4 在另一个文本字段中输入数字 6 它将第 4 个字母和第 6 个字母所在的句子大写 例如 用户输入 一年有 12 个月 输出将是 一年有 12 个月 如何将句子中的第四个和第六个
  • 层变换矩阵(CATransform3D等)但是用IBDesignable?

    本课程将透视一个直立的图像 它工作完美 但不能在 Storyboard 中使用 IBDesignable 实时工作 这是非常悲伤的 是否可以使用CATransform3D等通过IBDesignable在Storyboard上实时显示 Twi
  • 斯威夫特“NSArray?”没有名为“count”的成员

    我相当确定 count返回数组的长度 但由于某种原因 当我使用它时 它抛出了一个奇怪的错误 这是我的代码 let dataFile NSBundle mainBundle pathForResource RopeDataFile ofTyp
  • 在 Swift 4 中,如何删除基于块的 KVO 观察者?

    如果我像这样存储观察者 let observer NSKeyValueObservation foo observe value options new foo change in print change newValue 如何删除 禁用
  • Swift 错误中的 UIColor 扩展

    我有这个扩展 extension UIColor func rgba r Int g Int b Int a Float gt UIColor return UIColor red r 255 green g 255 blue b 255
  • Swift 4 的observeValue(forKeyPath:...)方法

    我一直在尝试寻找一个例子 但我所看到的并不适合我的情况 以下代码等效于什么 object addObserver self forKeyPath keyPath options new context nil override public
  • Swift - 带有两行文本的 UIButton

    我想知道是否可以创建一个包含两行文本的 UIButton 我需要每一行都有不同的字体大小 第一行为 17 点 第二行为 11 点 我尝试过将两个标签放在 UIButton 内 但我无法让它们留在按钮的范围内 我试图在 ui 构建器中完成所有
  • 将 Swift 闭包作为值添加到 Swift 字典中

    我想创建一个 Swift 字典 将 String 类型作为其键 将 Closures 作为其值 以下是我的代码 但它给了我错误 lvalue 与 String gt Void 不同 class CommandResolver private

随机推荐

  • NSTimer 触发时导致“无法识别的选择器”崩溃

    我正在使用一个NSTimer运行动画 现在只需调用它myMethod 然而 它导致了崩溃 这是代码 implementation SecondViewController Implement viewDidLoad to do additi
  • 设置 Angular 2 下拉列表中所选内容的值

    我正在使用 FormBuilder 将值添加到数据库 this formUser this form group firstName new FormControl Validators required lastName new Form
  • 将额外的参数传递给事件处理程序?

    假设我想在分配事件处理程序时传递一些额外的数据 考虑以下代码 private void setup string someData Object assignHandler evHandler public void evHandler O
  • Golang 斐波那契计算似乎已关闭

    我目前有以下用于斐波那契计算的代码 我正在尝试计算大数 但一旦达到 100 计算就会失败 对于 fib 100 我的代码返回 3736710778780434371 但是当我查看其他来源时 它告诉我正确的计算应该是 354224848179
  • ivot_table 索引中的 NaN 值会导致数据丢失

    这是一个简单的数据框 gt df pd DataFrame a a1 a2 a3 b optional1 None optional3 c c1 c2 c3 d 1 2 3 gt df a b c d 0 a1 optional1 c1 1
  • 所有案例均涵盖 Bresenham 的直线算法 [已关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我需要检查一行中的所有像素 因此我使
  • 使用 MPI_Gather openmpi c 收集字符串

    我想为每个进程生成一个字符串 然后收集所有内容 但是每个进程中创建的字符串是通过附加整数和字符来创建的 我仍然无法正确收集所有内容 我可以一一打印所有部分字符串 但如果我尝试打印 rcv string 我只会得到一个部分字符串 或者可能会出
  • 将字符串从 EBCDIC 转换为 Unicode / UTF8

    我可以从以下位置发送消息Java to Websphere MQ on AS400 如果我从以下位置发送消息WinXP 如果我使用任何可访问的 没有区别Locale 包括完整的语言本地化 英语也没有问题Locale 对于正确编码来说重要的只
  • 如何使用 ElasticSearch 在字符串字段中搜索精确的短语?

    我想在文档中搜索 社交网络营销 全部一起 但我继续得到单词分开的结果 我有以下 DSL 查询 fields title query bool should match title SEO must match content query M
  • Matplotlib FuncAnimation 只绘制一帧

    我正在尝试使用制作动画FuncAnimation模块 但我的代码只产生一帧然后停止 它似乎没有意识到需要更新什么 你能帮我看看出了什么问题吗 import numpy as np import matplotlib pyplot as pl
  • nginx:无效选项:“off”和entrypoint.sh::权限被拒绝

    我正在使用 Dockerfile 创建构建 然后通过 jenkins 作业部署该构建 映像 但容器状态为 CrashLoopBackOff 当我检查日志时 出现以下错误 Error nginx invalid option off etc
  • Javascript:在settimeout之前调用cleartimeout可以吗?

    我有一个设置计时器的函数 并在计时器到期时回调自身 我想知道的是在函数顶部清除计时器是否是不好的做法 这样做的原因是因为我会不时地异步调用该函数 如果我不先清除计时器 我将同时运行两个计时器 我意识到我可以在对函数进行其他调用之前清除计时器
  • 为什么 Android 上的 RxJava with Retrofit doOnError() 不起作用,而 Subscriber onError 却起作用

    有人可以解释一下为什么这样的代码 networApi getList subscribeOn Schedulers newThread observeOn AndroidSchedulers mainThread doOnError thr
  • 按钮上的图像

    我希望下面的两个脚本有相同的输出 但是当我执行时我没有在按钮上看到图像Script 1 然而 Script 2效果很好 Script 1 from Tkinter import class fe def init self master s
  • enumerate的实现细节是什么?

    Python 有enumerate 使用索引迭代对象 我怀疑解释器创建大量 int 对象的唯一目的是跟踪事物的位置 这政治公众人物页面 http www python org dev peps pep 0279 说了以下内容 但我不太明白幕
  • 获取WIFI信号强度-寻求最佳方法(IOCTL、iwlist(iw)等)

    我想扫描从3个AP接收到的信号强度 如果每 300 毫秒 最多 500 毫秒 发生一次 我会很高兴 我在路由器上刷了 OpenWRT 我正在寻找一个好的工具来做到这一点 首先 我发现 iwconfig 可以工作 但仅限于我连接到的网络 所以
  • 使用双寄存器方法解决亚稳态问题

    为了解决Verilog中不同时钟域引起的亚稳态 采用双寄存器方法 但据我所知 亚稳态的最终输出尚未确定 输出独立于输入 那么 我的问题是如何保证使用双寄存器方法输出的正确性 Thanks 您不能完全确定您避免了亚稳态 正如您所提到的 亚稳态
  • Mailchimp - 如何判断用户是否已取消订阅?

    因此 他们点击了时事通讯中的取消订阅链接 在他们的个人资料中 例如 此人于 2017 年 3 月 24 日下午 2 40 取消订阅 收到 时事通讯测试 6 后 很好 但是我如何通过 API 以编程方式判断某人是否已取消订阅呢 有可能吗 我问
  • 使用套接字/内存而不是文件在 Cuda 中解码视频

    我目前正在尝试使用 cuda 解码视频 我有一个名为cudaDecodeD3D9 该示例使用了一种名为cuvidCreateVideoSource它采用指向源视频的文件指针 有没有办法让Cuda从内存 套接字 流加载视频 结果我无法使用cu
  • swift 4:将对象与元组进行模式匹配(元组模式无法匹配非元组类型的值)

    我有一个带有几个字段的自定义结构 我想快速对其进行模式匹配switch语句 以便我可以通过将其中一个字段与正则表达式进行比较来自定义匹配 例如 鉴于此结构 struct MyStruct let header String let text