swift - 如何更正此 Swift 枚举?

标签 swift switch-statement

在 PluralSight 类(class)“Swift First Look”中,有一节关于枚举的内容似乎已过时。提供的代码是这样的:

//: Playground - noun: a place where people can play

import UIKit

enum CardType: String {
    case AmericanExpress = "AmericanExpress"
    case Visa = "Visa"
    case Discover = "Discover"
    case MasterCard = "MasterCard"
    case None = "None"

    private func regularExpression() -> NSRegularExpression {
        switch self {
        case .Visa:
            return NSRegularExpression(pattern: "^4[0-9]{12}(?:[0-9]{3})?$", options: nil, error: nil)
        case .AmericanExpress:
            return NSRegularExpression(pattern: "^4[47][0-9]{13}$", options: nil, error: nil)
        case .MasterCard:
            return NSRegularExpression(pattern: "^5[1-5][0-9]{14}$", options: nil, error: nil)
        case .Discover:
            return NSRegularExpression(pattern: "^6(?:011|5[0-9]{2})[0-9]{12}$", options:nil, error:nil)
        default:
            return NSRegularExpression(pattern: ".*", options:nil, error:nil)
        }
    }

    func isValidFor(cardNumber: String) -> Bool {
        let re = self.regularExpression()
        let range = NSRange(0..<cardNumber.lengthOfBytes(using: String.Encoding.utf8))
        let matches = re.numberOfMatches(in: cardNumber, options: .anchored, range: range)
        return matches > 0
    }

    static let allValues = [Visa, AmericanExpress, Discover, MasterCard]

    static func from(cardNumber: String) -> CardType? {
        for type in self.allValues {
            if type.isValidFor(cardNumber: cardNumber) {
                return type
            }
        }
    }
}

CardType.Visa.isValidFor(cardNumber: "4242424242424242")
CardType.Visa.isValidFor(cardNumber: "1234")

CardType.from(cardNumber: "4242424242424242").rawValue

问题在于switch block 中的return语句都有最新版本的XCode报错:

Type of expression is ambiguous without more context

另外,最后一行报错:

Value of optional type 'CardType?' not unwrapped; did you mean to use '!' or '?'?

我该如何更正此问题以及此处要求的当前 Swift 版本是什么?

注意:是的,我只是从 Swift 开始。

最佳答案

NSRegularExpression() 初始值设定项已更改。您必须为选项传递 [] 而不是 nil (但由于这是默认值,您可以完全不使用 options ),并且您必须处理它可能引发错误的事实。由于您正在处理不会失败的静态模式,因此您可以使用 try! 调用它们。通常,这很危险,因为如果返回错误,它会崩溃。有了这些静态模式,就不会发生这种情况(或者当它发生时您会修复它)。

改变:

return NSRegularExpression(pattern: "^4[0-9]{12}(?:[0-9]{3})?$", options: nil, error: nil)

到:

return try! NSRegularExpression(pattern: "^4[0-9]{12}(?:[0-9]{3})?$")

并对所有 NSRegularExpressions 重复上述操作。

对于最后一行,你只需要一个?:

CardType.from(cardNumber: "4242424242424242")?.rawValue

最后,此函数需要一个返回 nil 来说明在 for 循环中找不到 CardType 的情况:

static func from(cardNumber: String) -> CardType? {
    for type in self.allValues {
        if type.isValidFor(cardNumber: cardNumber) {
            return type
        }
    }
    return nil
}

关于swift - 如何更正此 Swift 枚举?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39690511/

相关文章:

regex - 如何仅从此字符串获取链接?

ios - 实例变量的奇怪行为 - 在某些时候无法访问

c# - 打开字符串会跳过所有情况

c++ - C++程序可以在if/else语句中包含switch语句吗?

android - 当切换按钮在android中更改状态时如何删除效果

ios - 设计 UITableView 背景图片

ios - 将数组 int 附加到字符串数组

swift - 解析指针数组 (Swift) - 这可能吗

Python "Switch-Case"替代显示错误

PHP Switch case问题,总是返回错误