0

ライブラリ プロジェクトのリクエストにAlamofireを使用しています。

を使用してルートとクエリを処理しようとしてenum Router: URLRequestConvertibleいますが、一度だけ設定する必要があるパラメーターと、デフォルト値を設定する必要があるパラメーターがあり、それらを処理する方法がわかりません。

サンプルコード

これは私がこれまでに持っているものです:

私のResultFromat列挙型

/// Available result formats
enum ResultFormat: String {
  case XML = "xml"
  case JSON = "json"
}

私のRouter列挙型

ここには、固定されていて作成時に設定する必要がある 1 つのパラメーター ( apiId) と、既定値を持つがメソッドresFormatを機能させるために管理しないパラメーター ( ) がありますinit

enum Router: URLRequestConvertible {
  static let API_BASE = "http://sbslocal/api2/"

  /// API ID to use in the API calls
  static let apiId : String

  /// Format to receive the response
  static var resFormat = ResultFormat.JSON

  // MARK: - Enum initialzer

  init(apiID: String) {
    Router.apiId = apiID
  }

  case Search(query: String)
  case ViewDetail(id: Int)

  // ... the rest of the cases ...

  // MARK: URLRequestConvertible



   var URLRequest: NSURLRequest {
    let (path: String, parameters: [String: AnyObject]?) = {
      /// Set the basic URL paameters
      var params = ["apiID": Router.API_ID, "format": Router.RESULT_FORMAT.rawValue]
      switch self {
      case .Search(let query):
        // Add the specific parameters for this case (i.e. query)
        params["query"] = query
        return ("/search", params)
        // ... the rest fo the cases
      }
    }()

    let URL = NSURL(string: Router.API_BASE)!
    let URLRequest = NSURLRequest(URL: URL.URLByAppendingPathComponent(path))
    let encoding = Alamofire.ParameterEncoding.URL

    return encoding.encode(URLRequest, parameters: parameters).0
  }


}

初期化のさまざまな可能性を確認しましたが、どれも機能していないようです。どんな助けでも感謝します。

4

1 に答える 1

0

わかりました、あなたのコードには 3 つの問題があります。

まず、列挙型にケースがないことです。厳密に必要かどうかはわかりませんが、Swift enum にはケースが必要なようです。single を使用できますcase Default

2 つ目は、初期化子を設定しないことですself。列挙型はケースで構成されているため、列挙型初期化子は、どのケースにself属するかを指定する必要があります。あなたはただ書くことができますself = .Default

3 つ目は、オプションではないプロパティを定義している場合、それを値なしにすることはできないということです。の初期値を提供することでapiId解決します。

これらの変更後、コードは次のようになります。

enum Router {

    case Default

    static let API_BASE = "http://sbslocal/api2/"
    static let apiId : String = ""
    static var resFormat = ResultFormat.JSON

    init(apiID: String) {
        Router.apiId = apiID
        self = Router.Default
    }
}

これは以下よりも使用できます:

let router = Router(apiID: "someID")

これがあなたが目指している API なら、ここにあります。

于 2014-12-24T13:28:14.250 に答える