在PluralSight课程“Swift First Look”中,有一个关于Enums的部分,它似乎已过时。提供的代码是这样的:如何更正此Swift枚举?
//: 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。
你使用的是什么版本的Swift?或者什么版本的Xcode。你所显示的代码是为Swift 1.x编写的,因为Swift语言正在变得如此迅速,它也太老了,以致于无法学习。 Swift的最新版本是3.0附带的Xcode 8.如果你找不到更新的课程,你需要面对类似的问题很多次。 – OOPer
我使用的是最新的XCode Swift,但课程是从2014年开始的。我只需要知道要做出什么样的更改。 –
一般来说,“为我做一切事情”的问题在这里不受欢迎。该代码是为Swift 1.x编写的,你说你正在使用最新的Xcode,这意味着你正在使用Swift 3.在展示你迄今为止所做的工作之后,你会得到更好更快的响应。 – OOPer