声明枚举路由器Alamofire swift 2.0

时间:2015-09-03 22:56:18

标签: swift enums alamofire

我试图效仿马特的一个例子,但我面对一些奇怪的事情。 我创建了一个名为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

有什么想法吗?

谢谢

3 个答案:

答案 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 {...}

到枚举,生成&从NSURLRequestpath

等其他组件返回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
}

}