What are the advantages/use cases of optional patterns introduced in swift 2?(swift 2 中引入的可选模式有哪些优点/用例?)
问题描述
对于像 if let 或 guard 这样的简单情况,我看不到优势,
For the simple cases like if let or guard I don't see the advantage,
if case let x? = someOptional where ... {
  ...
}
//I don't see the advantage over the original if let
if let x = someOptional where ... {
  ...
}
对于 for-case-let 案例来简化使用可选集合,我真的希望 swift 可以更进一步:
For the for-case-let case to simplify working with optional collections, I really hope swift can go one step further:  
for case let x? in optionalArray {
  ...
}
//Wouldn't it be better if we could just write
for let x? in optionalArray {
  ...
}
谷歌搜索了一段时间后,我发现唯一有用的案例是Swift 2 模式匹配:展开多个选项" :
After google it for a while the only case I find useful is this "Swift 2 Pattern Matching: Unwrapping Multiple Optionals" :
switch (username, password) {
case let (username?, password?):
    print("Success!")
case let (username?, nil):
    print("Password is missing")
...
那么引入可选模式还有其他好处吗?
So any other advantages of introducing optional patterns?
推荐答案
我相信您将两个不同的概念混为一谈.诚然,语法并不是很直观,但我希望它们的用途在下面得到澄清.(我建议阅读关于 Patterns in 中的页面Swift 编程语言.)
I believe you're conflating two different concepts. Admittedly, the syntax isn't immediately intuitive, but I hope their uses are clarified below. (I recommend reading the page about Patterns in The Swift Programming Language.)
案例条件"指的是写作能力:
The "case condition" refers to the ability to write:
如果 case «pattern» = «expr» { ... }while case «pattern» = «expr» { ... }for case «pattern» in «expr» { ... }
if case «pattern» = «expr» { ... }while case «pattern» = «expr» { ... }for case «pattern» in «expr» { ... }
这些特别有用,因为它们让您无需使用 switch 即可提取枚举值.
These are particularly useful because they let you extract enum values without using switch.
你的例子,if case let x?= someOptional ...,是一个有效的例子,但是我相信它对 除 Optional 之外的枚举 最有用.
Your example, if case let x? = someOptional ..., is a valid example of this, however I believe it's most useful for enums besides Optional.
enum MyEnum {
    case A
    case B(Int)
    case C(String)
}
func extractStringsFrom(values: [MyEnum]) -> String {
    var result = ""
    // Without case conditions, we have to use a switch
    for value in values {
        switch value {
        case let .C(str):
            result += str
        default:
            break
        }
    }
    // With a case condition, it's much simpler:
    for case let .C(str) in values {
        result += str
    }
    return result
}
您实际上可以将 case 条件与您通常在 switch 中使用的几乎任何模式一起使用.有时会很奇怪:
You can actually use case conditions with pretty much any pattern that you might normally use in a switch. It can be weird sometimes:
if case let str as String = value { ... }(相当于if let str = value as?String)if case is String = value { ... }(相当于if value is String)if case 1...3 = value { ... }(等价于if (1...3).contains(value)或如果 1...3 ~= 值)
if case let str as String = value { ... }(equivalent toif let str = value as? String)if case is String = value { ... }(equivalent toif value is String)if case 1...3 = value { ... }(equivalent toif (1...3).contains(value)orif 1...3 ~= value)
另一方面,可选模式是一种模式,除了简单的 if let 之外,它还允许您在上下文中解开可选选项.它在 switch 中使用时特别有用(类似于您的用户名/密码示例):
The optional pattern, on the other hand, is a pattern that lets you unwrap optionals in contexts besides a simple if let. It's particularly useful when used in a switch (similar to your username/password example):
func doSomething(value: Int?) {
    switch value {
    //case 2:  // Not allowed
    case 2?:
        print("found two")
    case nil:
        print("found nil")
    case let x:
        print("found a different number: (x)")
    }
}
                        这篇关于swift 2 中引入的可选模式有哪些优点/用例?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:swift 2 中引入的可选模式有哪些优点/用例?
				
        
 
            
        基础教程推荐
- 如何使用 YouTube API V3? 2022-01-01
 - 在 iOS 上默认是 char 签名还是 unsigned? 2022-01-01
 - Android文本颜色不会改变颜色 2022-01-01
 - “让"到底是怎么回事?关键字在 Swift 中的作用? 2022-01-01
 - 使用 Ryzen 处理器同时运行 WSL2 和 Android Studio 2022-01-01
 - :hover 状态不会在 iOS 上结束 2022-01-01
 - 固定小数的Android Money Input 2022-01-01
 - Android ViewPager:在 ViewPager 中更新屏幕外但缓存的片段 2022-01-01
 - 如何使 UINavigationBar 背景透明? 2022-01-01
 - LocationClient 与 LocationManager 2022-01-01
 
    	
    	
    	
    	
    	
    	
    	
    	
				
				
				
				