如何使用一些预定义的参数创建`enum Router:URLRequestConvertible`

时间:2014-12-24 12:50:14

标签: swift enums alamofire

我在库项目中使用Alamofire来处理我的请求。

我尝试使用enum Router: URLRequestConvertible来处理路线和查询,但我有一些参数应该只设置一次,而某些参数应该有默认值而且我没有#39}知道处理它们。

示例代码

这是我到目前为止所做的:

我的ResultFromat枚举

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

我的Router枚举

这里有一个固定的参数,应该在创建时设置(apiId),一个具有默认值(resFormat),但不要使用{init进行设置。 1}}方法工作。

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
  }


}

我已经检查了初始化的不同可能性,但它们似乎都没有工作。任何帮助都会被贬低。

1 个答案:

答案 0 :(得分:0)

好的,所以我发现你的代码存在三个问题。

首先,你的枚举没有任何案例。不确定它是否是严格要求的,但似乎在Swift枚举中需要有一个案例。你可以使用单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,那就来了。