我如何更正此Swift枚举?

时间:2016-09-25 18:45:09

标签: swift switch-statement

在PluralSight课程“Swift First Look”中,有一个关于Enums的部分似乎已经过时了。提供的代码是:

//: 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

这个问题是交换机块中的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。

1 个答案:

答案 0 :(得分:1)

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

最后,当return nil循环中找不到CardType时,此函数需要for来说明情况:

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