0

我正在使用Alamofire来处理我对图书馆项目的请求。

我正在尝试使用 anenum Router: URLRequestConvertible来处理路由和查询,但我有一些参数应该只设置一次,有些应该有默认值,我不知道如何处理它们。

示例代码

这是我到目前为止所拥有的:

我的ResultFromat枚举

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

我的Router枚举

这里有一个参数是固定的,应该在创建时设置 ( 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

好的,所以我看到您的代码存在三个问题。

首先是你的枚举没有任何案例。不确定它是否是严格要求的,但似乎在 Swift 中枚举需要有一个案例。你可以只使用 single case Default

第二件事是您没有self在初始化程序中进行设置。枚举初始化器,因为枚举是由案例组成的,所以需要指定self属于哪个案例。你可以只写self = .Default

第三件事是,如果您要定义非可选属性,则不能使其无价值。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 回答