一 协议
1 RawRepresentable
实现该协议可以
1.1 如果实现协议的不是enmu,则让该类拥有enmu的能力
1.2 如果实现协议的是enmu,则让enmu可以自定义原值(rawValue)的类型
二 为什么用Struct模仿enum,而不直接用enmu:String
源码如下:
public struct HTTPMethod: RawRepresentable, Equatable, Hashable {
/// `CONNECT` method.
public static let connect = HTTPMethod(rawValue: "CONNECT")
/// `DELETE` method.
public static let delete = HTTPMethod(rawValue: "DELETE")
/// `GET` method.
public static let get = HTTPMethod(rawValue: "GET")
/// `HEAD` method.
public static let head = HTTPMethod(rawValue: "HEAD")
/// `OPTIONS` method.
public static let options = HTTPMethod(rawValue: "OPTIONS")
/// `PATCH` method.
public static let patch = HTTPMethod(rawValue: "PATCH")
/// `POST` method.
public static let post = HTTPMethod(rawValue: "POST")
/// `PUT` method.
public static let put = HTTPMethod(rawValue: "PUT")
/// `TRACE` method.
public static let trace = HTTPMethod(rawValue: "TRACE")
public let rawValue: String
public init(rawValue: String) {
self.rawValue = rawValue
}
}
1 遵循“开闭原则”
开闭原则:一个软件实体如类、模块和函数应该对扩展开放,对修改关闭
如果是enmu,当需要拓展新的method类型的时候需要更改源码。但是如果是struct则可以通过extension拓展
public enum HTTPMethodEnum: String {
case connect, delete, get, head, options, patch ,post, put, trace
}
/// xcode报错,无法通过extension拓展enmu
extension HTTPMethodEnum {
case custom
}
extension HTTPMethod {
static let custom = HTTPMethod(rawValue: "CUSTOM")
}
2 面向对象的思想
就如同Alamofire的序列化思想一样,将每个都当做一个对象去对待。