如何使用一些预定义参数创建“枚举路由器:URLRequestConvertible”

Posted

技术标签:

【中文标题】如何使用一些预定义参数创建“枚举路由器:URLRequestConvertible”【英文标题】:How to create a `enum Router: URLRequestConvertible` with some predefined parameters 【发布时间】:2014-12-24 12:50:14 【问题描述】:

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

我正在尝试使用enum 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
  



我已经检查了初始化的不同可能性,但它们似乎都不起作用。任何帮助都将不胜感激。

【问题讨论】:

枚举没有初始化方法。类。 有,请阅读这里的介绍:developer.apple.com/library/ios/documentation/Swift/Conceptual/… 啊,我明白了,我的错。谢谢 【参考方案1】:

好的,我发现您的代码存在三个问题。

第一件事是你的枚举没有任何大小写。不确定它是否是严格要求的,但似乎在 Swift 中枚举需要有一个案例。您可以只使用单个case Default

第二件事是您没有在初始化程序中设置self。枚举初始化器,因为枚举由 case 组成,需要指定 self 属于哪个 case。你可以写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,那就来吧。

【讨论】:

这只是我枚举的一部分,不是为了放所有代码,但我有案例,我已经扩展了一点代码以更好地展示它。 @pconcepcion 谢谢!你在init里还是没有给self赋值,你试过了吗?

以上是关于如何使用一些预定义参数创建“枚举路由器:URLRequestConvertible”的主要内容,如果未能解决你的问题,请参考以下文章

如何创建传递参数的自定义Facebook共享对话框?

如何在vue.js 2应用程序中全局使用自定义装饰器?

Java自定义注解

jmeter的一些知识目录

Python:如何在创建 RecycleView 时访问自定义参数?

为啥有些参数是使用预定义的路由添加的,而另一些则放在查询字符串中?