如何使用一些预定义参数创建“枚举路由器: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”的主要内容,如果未能解决你的问题,请参考以下文章