Tag: 模式匹配

快速开关案例和模式匹配的有趣案例

快速切换案例很有趣,这有很多原因。 首先,如果您是Obj-C开发人员,那么能够在字符串和除整数以外的任何类型上使用切换用例的功能就足够有趣了。 这是一个非常正常的简单开关案例,它使用字符串名称来标识它的主服务器。 但这还不止于此,swift的模式匹配使它变得更加有趣。 输入模式匹配,事情变得更加有趣。 现在,如果切换案例精通是一个合并规则,那么如果我不能独自声明标题,那我的伙伴也必须在那里同时将双键翻转在一起。 为了解决这个问题,我们可以匹配一个元组。 在这里,我们将一个具有两个名称的元组匹配,但是如果这种伙伴关系稍微放松一点,并且只要您中至少有一个存在,您就可以与任何想要的人一起去呢? 您始终可以忽略元组中的值,而仅检查一个名称。 在某些情况下,您可能并不关心匹配元组的一部分,但是您仍然需要知道其值。 在这种情况下,您可以在元组的该部分之前使用“ let”。 带有模式匹配的切换案例在很多情况下都可以使用,并且在很多情况下都可以使用,您会在许多流行的开源库的心脏中找到它,在Moya内找到它来命名。 在注释中命名带有切换用例和模式匹配的开放源代码,此外,如果您有任何其他情况,请提及它,我很乐意更新并添加该文章。

在Swift中编写自定义模式匹配

您也可以在我的博客SwiftRocks中阅读此文章,这是一个凉爽的地方! 模式匹配在Swift中随处可见,您可能已经使用了无数次来解构和绑定值(如switch例)。 尽管常规的switch例是模式的最常用用法,但是Swift有几种类型的模式可以混合使用,甚至可以在switches外使用,从而产生真正的简短代码。 我特别感兴趣的一件事是模式匹配可以用于各种各样的事情。 乍一看,很容易将模式匹配视为简单的相等性检查: 开关80 { 案例100: // 案例80: //匹配,因为80 == 80 默认: 打破 } 鉴于此,您可能会认为case “eighty”这样的case “eighty”将无法编译,毕竟”eighty”和80甚至都不是同一类型–如果您现在尝试使用,确实会发生以下情况: 如果案例“八十” = 80 { //错误:类型为“字符串”的表达式模式不能与类型为“ Int”的值匹配 } 但这并不一定。 在开发项目时,您可能已经注意到某些类型之间具有特殊的交互作用,例如Ranges及其关联的类型: 开关80 { 情况0 … 20: 打破 案例21 … 50: 打破 案例51 … 100: //匹配,因为80位于51 … 100之内 默认: 打破 } 原因是~= 模式匹配运算符 。 这个运算符在常规项目中没有看到太多用处(您可能之前已经看到过,因为这个确切的例子是范围内的数字 ),但是在Swift中它在内部被大量使用,这正是用于确认case语句的内容。 在大多数情况下,运算符是用于进行相等性检查的简单包装器(例如Int示例),但是Range在针对自己的关联类型使用~=时,具有特殊的实现,可让其在模式匹配时具有以下自定义行为: 扩展名RangeExpression { […]

Swift中的专业模式匹配

创建人: Nick Teissler switch语句是Swift语言不可否认的优势。 switch语句的后面是Swift的模式匹配,它使代码更易读,更安全。 可以获取开关的模式匹配的可读性和功能,并将其应用于代码中的其他位置。 Swift语言参考指定了八种不同的模式。 很难知道在模式匹配表达式中使用的正确语法。 在典型的用例中,您可能需要了解类型信息,解开变量或仅确认可选项为非零。 使用正确的模式,可以避免尴尬的拆包和未使用的变量。 模式匹配中有两个参与者:模式和值。 该值是switch关键字之后的表达式,如果在switch语句之外测试该值,则为=运算符。 模式是case标签后面的表达式。 模式和值使用Swift语言的规则相互评估。 截至2018年7月15日,该参考文献包含一些关于在散文中如何使用模式以及在何处使用模式的错误,但是可以通过一些实验来发现这些错误。[1] 我们将研究在if , guard和while语句中应用模式,但在进行操作之前,让我们热切关注switch语句的一些非常规用法。 如果尝试匹配的值可能为nil,我们可以使用Optional Pattern来仅在该值不为nil时匹配该值,并作为奖励将其拆开。 在处理遗留的(和一些不太传统的)Objective-C方法和函数时,这特别有用。 从Swift 4.2开始,随着IUO的重新实现! 将成为的代名词? 。 对于没有可空注释的Objective-C函数,您可能必须处理此行为。 这里的示例特别琐碎,因为这种新行为可能来自Swift <4.2。 使用此Objective-C函数: Swift签名将为: func aLegacyObjcFunction() -> String! ,在Swift 4.1中,此函数将编译: 在Swift 4.2中,您会收到错误消息:“可选类型’String’的值? 没有包装; 你是说用’!’ 要么 ‘?’?”。 不直观的部分是, return aLegacyObjcFunction()仍将编译,因为它会跳过变量分配以及类型推断。 我们应该更优雅地处理此问题, 尤其是如果所讨论的Objective-C函数实际上可以返回nil 。 这次,我们有意地处理可选项。 请注意,我们不会像往常一样打开包装OptionalString。 就像我们说过if let output = optionalString […]