在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。
答案 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
}