我试图效仿马特的一个例子,但我面对一些奇怪的事情。 我创建了一个名为Router.swift的文件并粘贴以下代码:
//
// Router.swift
import Alamofire
enum Router: URLRequestConvertible {
static let baseURLString = "http://example.com"
case CreateUser([String: AnyObject])
case ReadUser(String)
case UpdateUser(String, [String: AnyObject])
case DestroyUser(String)
var method: Alamofire.Method {
switch self {
case .CreateUser:
return .POST
case .ReadUser:
return .GET
case .UpdateUser:
return .PUT
case .DestroyUser:
return .DELETE
}
}
var path: String {
switch self {
case .CreateUser:
return "/users"
case .ReadUser(let username):
return "/users/\(username)"
case .UpdateUser(let username, _):
return "/users/\(username)"
case .DestroyUser(let username):
return "/users/\(username)"
}
}
}
我收到以下错误:
Type 'Router' does not conform to protocol 'URLRequestConvertible'
我正在使用Alamofire branch swift-2.0 Xcode 7R6
有什么想法吗?
谢谢
答案 0 :(得分:4)
根据Alamofire的文档,URLRequest必须是NSMutableURLRequest
而不是NSURLRequest
。
因此,请在上面的示例中更改为以下内容:
var URLRequest: NSMutableURLRequest {
let URL = NSURL(string: baseURLString)!
let mutableURLRequest = path != nil ? NSMutableURLRequest(URL: URL.URLByAppendingPathComponent(path!)) : NSMutableURLRequest(URL: URL)
mutableURLRequest.HTTPMethod = method.rawValue
if let authorizationHeader = authorizationHeader { mutableURLRequest.setValue(authorizationHeader, forHTTPHeaderField: "Authorization") }
let encoding = Alamofire.ParameterEncoding.URL
return encoding.encode(mutableURLRequest, parameters: [ "foo": "bar" ]).0
}
答案 1 :(得分:1)
你应该添加一个
var URLRequest: NSURLRequest {...}
到枚举,生成&从NSURLRequest
或path
method
实施例
var URLRequest: NSURLRequest {
let URL = NSURL(string: baseURLString)!
let mutableURLRequest = path != nil ? NSMutableURLRequest(URL: URL.URLByAppendingPathComponent(path!)) : NSMutableURLRequest(URL: URL)
mutableURLRequest.HTTPMethod = method.rawValue
if let authorizationHeader = authorizationHeader { mutableURLRequest.setValue(authorizationHeader, forHTTPHeaderField: "Authorization") }
let encoding = Alamofire.ParameterEncoding.URL
return encoding.encode(mutableURLRequest, parameters: [ "foo": "bar" ]).0
}
答案 2 :(得分:1)
当你的枚举采用URLRequestConvertible协议时,它必须有一个名为URLRequest的NSURLRequest类型的变量。
在Swift 1.2中,这符合NSMutableURLRequest而不是NSURLRequest对我有效:
enum Router: URLRequestConvertible{
static let baseURLString = ""
static let clientId = ""
static let clientSecret = ""
case NewUser(String, String, String)
var URLRequest: NSMutableURLRequest {
var path: String {
switch self {
case .NewUser:
return "/users"
}
}
var parameters: [String: AnyObject] {
switch self {
case .NewUser (let userName, let email, let password):
let params = ["Username": userName, "Email": "\(email)", "Password": password, "Client_Id": Router.clientId, "Client_Secret": Router.clientSecret]
return params
}
}
let URL = NSURL(string: Router.baseURLString)
let URLRequest = NSURLRequest(URL: URL!.URLByAppendingPathComponent(path))
let encoding = Alamofire.ParameterEncoding.URL
return encoding.encode(URLRequest, parameters: parameters).0
}
}