好问题。让我们分别分解每个。
在实际的API中,URLRequestConvertible的正确用法是什么?
该URLRequestConvertible
协议是确保给定对象可以创建有效的轻量级方法NSURLRequest
。确实并没有一套严格的规则或指南来强迫您以任何特定方式使用此协议。仅仅是允许其他对象存储正确创建所需状态的便利协议NSURLRequest
。可以在此处找到有关Alamofire的更多信息。
我应该为每个端点创建一个路由器吗?
当然不。那会破坏使用Enum
。Swift Enum对象具有强大的功能,使您可以共享大量的公共状态,并打开实际上不同的部分。能够NSURLRequest
使用以下简单的内容创建一个,确实非常强大!
let URLRequest: NSURLRequest = Router.ReadUser("cnoon")
我不知道为什么将枚举用于构建路由器?为什么我们不将类与静态方法一起使用?
使用枚举是因为它是在公共接口下表达多个相关对象的更为简洁的方法。所有情况之间共享所有方法。如果使用静态方法,则每种方法的每种情况都必须有一个静态方法。否则,您将不得不在对象内部使用Obj-C风格的枚举。这是我的意思的简单示例。
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.HTTPMethod {
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)"
}
}
}
要获取任何不同端点的方法,您可以调用相同的方法,而不必传入任何参数来定义要查找的端点类型,选择的情况已经对此进行了处理。
let createUserMethod = Router.CreateUser.method
let updateUserMethod = Router.UpdateUser.method
或者,如果您要获取路径,请使用相同类型的呼叫。
let updateUserPath = Router.UpdateUser.path
let destroyUserPath = Router.DestroyUser.path
现在,让我们尝试使用静态方法的相同方法。
struct Router: URLRequestConvertible {
static let baseURLString = "http://example.com"
static var method: Method {
}
static func methodForEndpoint(endpoint: String) -> Method {
}
static var path: String {
}
static func pathForEndpoint(endpoint: String) -> String {
}
static var pathForCreateUser: String {
return "/create/user/path"
}
static var pathForUpdateUser: String {
return "/update/user/path"
}
}
注意:如果您没有打开案例的许多属性或函数,那么枚举与结构相比并没有很多优点。它只是使用不同语法糖的替代方法。
枚举可以最大化状态和代码重用。关联的值还允许您执行一些非常强大的功能,例如对对象进行分组,这些对象有些相似,但是有不同的要求……例如NSURLRequest
创建。
为枚举案例构造参数以提高可读性的正确方法是什么?(必须将这个捣碎在一起)
这是一个了不起的问题。您已经提出了两个可能的选择。让我添加一个可能更适合您需求的三分之一。
case CreateUser(username: String, firstName: String, lastName: String, email: String)
case ReadUser(username: String)
case UpdateUser(username: String, firstName: String, lastName: String, email: String)
case DestroyUser(username: String)
如果您有关联的值,我认为为元组中的所有值添加显式名称会有所帮助。这确实有助于构建上下文。缺点是您必须像这样在switch语句中重新声明这些值。
static var method: String {
switch self {
case let CreateUser(username: username, firstName: firstName, lastName: lastName, email: email):
return "POST"
default:
return "GET"
}
}
尽管这为您提供了一个很好的,一致的上下文,但它却变得非常冗长。在Swift中,这是您目前的三个选项,哪个是正确使用的选项,取决于您的用例。
更新资料
随着🔥🔥Alamofire 4.0🔥🔥的发布,该弹头URLRequestConvertible
现在变得更加智能,也可以扔出。我们已为Alamofire添加了全面支持,以处理无效请求并通过响应处理程序生成明智的错误。我们的自述文件中详细记录了此新系统。
case
语句。对我来说,这似乎是一个巨大的方法。我不确定这是否会导致可读代码...