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