一.注释的写法:
1 init
1.1 标明初始化所产生的对象的特征
1.2 Creates a/an XXXX from XXXX. what different form instance by init
/// Creates an empty instance.
public init() {}
/// Create an instance from an array of `HTTPHeader`s. Duplicate case-insensitive names are collapsed into the last.
/// name and value encountered.
public init(_ headers: [HTTPHeader]) {
self.init()
headers.forEach { update($0) }
}
/// Create an instance form a `[String: String]`. Duplicate case-insensitive names are collapsed into the last name.
/// and value encounterd.
public init(_ dictionary: [String: String]) {
self.init()
dictionary.forEach{ update(HTTPHeader(name: $0.key, value: $0.value))}
}
2 普通方法
2.1 标明该方法的作用
2.2 标明该方法对instance or class 所产生的的影响
2.3 标注该方法会产生的副作用和注意点
2.4 如果有参数,需要在说明和参数说明之间回车一行
2.5 标明返回值的意义
2.6 如果返回值是可选类型(optional)则需要注明:if it exists.
2.7 返回值回车一行
3 计算属性
3.1 标明该计算属性的意义
3.2 标明该计算属性所依赖的变量,即如何计算的
4 其他
4.1 所有的形参和实参需要``包裹
4.2 结尾加.
4.3 注意三单形式
4.4 对于假设:It is assumed, per Swift naming conventions, that the first character of the key is lowercase.
二 协议
1 ExpressibleByDictionaryLiteral
实现该协议可以字典一样简易初始化[:]
extension HTTPHeaders: ExpressibleByDictionaryLiteral {
public init(dictionaryLiteral elements: (String, String)...) {
self.init()
elements.forEach{ update(name: $0.0, value: $0.1) }
}
}
2 ExpressibleByArrayLiteral
实现该协议可以像数组一样初始化[]
extension HTTPHeaders: ExpressibleByArrayLiteral {
public init(arrayLiteral elements: HTTPHeader...) {
self.init(elements)
}
}
3 Sequence & Collection
实现这两个协议可以视为数组,同数组一样使用
extension HTTPHeaders: Sequence {
public func makeIterator() -> IndexingIterator<[HTTPHeader]> {
headers.makeIterator()
}
}
extension HTTPHeaders: Collection {
public var startIndex: Int {
headers.startIndex
}
public var endIndex: Int {
headers.endIndex
}
public subscript(position: Int) -> HTTPHeader {
headers[position]
}
public func index(after i: Int) -> Int {
headers.index(after: i)
}
}
headers.map
headers.isEmpty
for header in sessionHeaders
4 CustomStringConvertible
实现该协议可以控制打印输出,同OC的description方法
三 特殊函数
subscript
public subscript(_ name: String) -> String?
实现该函数可以使用下标
public subscript(_ name: String) -> String? {
get { value(for: name) }
set {
if let value = newValue {
update(name: name, value: value)
} else {
remove(name: name)
}
}
}
headers[header.name] = header.value
四 只读属性的写法
1 计算属性
public var dictionary: [String: String] {
let namesAndValues = headers.map { ($0.name, $0.value) }
return Dictionary(namesAndValues, uniquingKeysWith:{ _, last in last })
}
2 存储属性
private(set) var name: String
五 简单工厂的写法
public static var sortedKeys: JSONParameterEncoder {
let encoder = JSONEncoder()
encoder.outputFormatting = .sortedKeys
return JSONParameterEncoder(encoder: encoder)
}