2016-09-25 7 views
0

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の最新バージョンはどのように修正する必要がありますか?

注:はい、私はちょうどスウィフトから始まります。

+0

あなたはどのバージョンのSwiftを使用していますか? Xcodeのバージョン。あなたが示したコードは、Swift言語がすばやく変化しているので、Swift 1.x用に書かれています。 Swiftの最新バージョンにはXcode 8が付属しています。最新のコースが見つからない場合は、同様の問題に長時間遭遇する必要があります。 – OOPer

+0

最新のXCode Swiftを使用していますが、コースは2014年以降です。変更する必要があるかどうかを知る必要があります。 –

+0

一般的に、「私のためにすべてをやる」という質問はここでは歓迎されません。このコードはSwift 1.x用に書かれたもので、最新のXcodeを使用していると言います。これはSwift 3を使用していることを意味します。今まで行ったことを示すことで、より迅速で迅速な対応ができます。 – OOPer

答えて

1

NSRegularExpression()イニシャライザが変更されました。オプションの場合はnilの代わりに[]を渡す必要がありますが(デフォルト値であるため、optionsを省略することができます)、エラーが発生する可能性があるという事実に対処する必要があります。あなたが失敗しない静的パターンを扱っているので、try!でそれらを呼び出すことができます。一般に、エラーが返された場合にクラッシュするため危険です。これらの静的なパターンでは、それは起こりません(または、それが起こったときに修正するでしょう)。

変更:

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

NSRegularExpressionsのすべてのためにそれを繰り返します。

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

へ。最後の行のために

、あなただけの?が必要になります。

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

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

最後に、この機能はCardTypeforループ内で見つからないとき場合を考慮してreturn nilを必要とします

+0

ありがとうございます - それは助けになります!ちょうど私が必要としたもの。これらのエラーはちょっと慣れていますが、少なくともこれは意味をなさないものです。 –

+0

あなたは大歓迎です。 Swift 1.1から多くの変更がありました。 Swift 2.2 - > 3.0への移行は、APIのもう一つの巨大なものです。オートコンプリートはあなたの友人です。これらのAPIが変更されている場合(ほとんどすべての場合)は、ゼロから入力して、オートコンプリートの提案を確認してください。 – vacawama

+0

クール、ありがとう!私は可能な限りオートコンプリートを使用していますが、それはエイリアンのエラーです。 Macでのコーディングは私にとっては新しいものですが、コーディングは新しいものではありません。 Btw、戻り値なしを返す代わりに.Noneを返さずに、 'None'という名前が 'none'に変更されたというエラーが出ますが、別のCardType戻り値を置くことは問題ありません。私は明らかにCardType.Noneを置くことができます。 –

関連する問題