1. Swift Magic
<1> Swifter book ✔️✔️✔️
<2> Advanced Swift book ✔️✔️✔️
<3> WWDC Session & Sample Code ✔️
<4> CountDown to WWDC 60 Days ✔️✔️✔️
<5> SwifterSwift ✔️✔️✔️
<6> iina & Alamofire & Kingfisher ✔️
<7> SwiftNIO ✔️
Tag:
** == Array_Dict_Set_Range + Sequence_Collection + Optional + Struct_Class + Encoding_Decoding + Function + String + Error + Generics + Protocol + C Bridging
2. Counterpart
Quick shot: 每个部分会用很简短的话来提示,帮助自己记忆。
<1> Swifter book note
Quick shot: 基本围绕 ** 这十一主题展开,其中的知识点在 Advanced Swift 中有更加详细的讲解。Playground 很强大,值得探索。
1. Range - … & ..<
2. Protocol - mutating + Self + extension + optional protocol
3. Sequence - IteratorProtocol + ExpressibleByArray/StringLiteral + subscript + typealias + associatedtype + lazy + indirect & nested enum + OptionSet + enumerate
4. Function - tuple + @autoclosure && ?? + @escaping + func nesting + default param + 属性观察 + final + KeyPath & KVO + 尾递归 + 性能考虑
5. Optional - chaining + operator + pattern-match + ImplicitlyUnwrappedOptional + 多重 Optional + Optional Map + where & pattern-match + do { … } + 判等
6. Struct & Class - func-params + weak & unowned + value & reference Type + 闭包歧义
7. String - regex + String & NSString + CustomStringConvertible & CustomDebugStringConvertible + Log输出 + 输出格式化
8. Error - 错误和异常处理 + 断言 + fatalError
9. Generics - 随机数生成 + 泛型扩展
10. Encode & Decode - JSON & Codable
11. C & OC & iOS -
UnsafePointer + C 指针内存管理 + COpaquePointer & C convention + 调用 C 动态库 + C 代码调用 和 @asmname + Toll-Free Bridging & Unmanaged<T>
@objc & dynamic + type(of:) + is + 类型编码 @encode + Associated Object
@UIApplicationMain + @autoreleasepool + GCD & asyncAfter + singleton + 类簇 + delegate + @synchronized + NSNull + 宏定义 define + @dynamic == @NSManaged
12. Playground - 延时运行 与 项目协作 与 可视化开发
13. Swift - nameSpacing + init + designated & convenience & required + init? + static & class + [protocol] & case typeValue(type) + AnyClass & meta type & .self + dynamic Type + reflection & mirror + selector + dynamic call instance method + Swift 命令行工具 + 属性访问控制 + 兼容性 + @testable + 条件编译 + 编译标记
14. Other - 代码组织和 Framework + 安全的资源组织方式 + 文档注释 + 溢出 32 64 + 哈希
<2> Advanced Swift note 1...5 & 6...
Quick shot: 一些语言的描述,措辞和文笔都非常值得学习。FIFOQueue & List & SortDescriptor & Regex 都是非常好的模板例子。源码和 proposal 是核心呀。
介绍
<1> Swift 是什么样的语言,与其他语言的相似之处,定义了值,变量,引用,常量。
<2> 为了避免引用的浅复制,引入了“写时复制”这种高效的深复制技术。
<3> 闭包、柯里化函数、静态派发、动态派发、重写、重载、多态的定义。
<4> Swift API 设计准则Array_Dict_Set_Range
<1> Array 与 NSArray 的不同,Array 的基本操作。Array 的变形( Map、Filter、Reduce、flatMap、forEach) 与 ArraySlice
<2> Dict 的操作。Hashable 的要求。自动满足Equatable 和Hashable
<3> Set (无序contains + 不重复) 与基本操作。IndexSet(范围列表) 与CharacterSet(字符子集)。
<4> Range(..<) & ClosedRange(…)。CountableRange & CountableClosedRange。RangeExpressionSequence_Collection
<1> Sequence 的实现依赖于 Iterator。自定义 PrefixSequence,就默认具有 Sequence 的各种便利方法。
<2> 基于函数的 AnySequence + sequence(first/state:next:)
<3> SubSequence 及相关操作 + 链表(基于此可以实现 LRU)
<4> Collection + FIFOQueue: Collection + 遵守的最小条件
<5> Iterator + SubSequence + IndexDistance + Indices
<6> index + 自定义集合索引(WordsIndex & Words : Collection ) + Slice
<7> BidirectionalCollection + RandomAccessCollection + MutableCollection + RangeReplaceableCollectionOptional
<1> Optional chaining + ?? + Optional map/flatMap(与 if let 与 chaining) + Sequence flatMap
<2> 可选值判等 + fatalError & assert & precondition
<3> 隐式解包可选值Struct_Class
<1> 两者不同点。mutating 与 inout
<2> 写时复制及实现及陷阱(字典访问与下标访问)
<3> weak & unownedEncoding_Decoding
<1> Encodable & Decodable + 自动遵循 & 编解码过程
<2> Encoder & KeyedContainer & UnkeyedContainer & SingleValueContainer
<3> 编译器生成的代码 - CodingKeys: CodingKey + encode(to:) + init(from:)
<4> 手动遵守协议 - 自定义 Coding Keys & 自定义 encode(to:) 和 init(from:)
<5> 他人的代码 & 类 & 枚举 满足 CodableFunction
<1> SortDescriptor 实现 - 泛型 & Comparable & ComparisonResult & combine & <||> & 可选值
<2> merge 函数进化 + 函数作为代理
<3> willSet & didSet 与 KVO + lazy
<4> 下标(泛型) + 键路径(SortDescriptor)(可写键路径(双向绑定) + 键路径层级)
<5> @autoclosure + @escapingString
<1> Unicode + unicodeScalars
<2> String + Character + : BidirectionalCollection, RangeReplaceableCollection
<3> String.Index 操作 + subString
<4> StringProtocol
<5> 编码单元视图 - unicodeScalars,utf16 和 utf8 + String 与Foundation API
<6> 文本输出流 & TextOutputStream/able
<7> 字符串性能 - 幻影 (phantom) 类型Error
<1> Result 类型 + do/catch & throws
<2> rethrows + defer + try?Generics
<1> 自由函数的重载 + 运算符的重载 + 泛型约束重载(最小条件抽象) + 闭包对行为进行参数化(闭包判等)
<2>集合泛型 - (泛型)二分查找 + 集合随机排列
<3> 泛型 - 代码设计 + 共通功能 + 泛型数据类型
<4> 泛型的工作方式 + 特化 + 全模块优化Protocol
<1> 接口抽象 + 关联类型 + extension + 类型约束 & 独立的类型
<2> protocol 与 继承 + 协议方法的动/静态派发
<3> 类型抹消 - 简单方法 与 标准库通过类继承把类型隐藏在子类
<4> 不透明/类存在容器 + 目击表
<5> 泛型参数 比 协议类型高效得多C Bridging
<1> C 导入 Swift + 封装
<2> managed & unsafe & buffer & raw & mutable
<3> 指针 - Unsafe[Mutable]Pointer & Unsafe[Mutable]RawPointer & OpaquePointer & Unsafe[Mutable]BufferPointer & Unsafe[Mutable]RawBufferPointer
<4> MemoryLayout.size/stride + @convention(c)
<5> qsort_r - 类型安全 和 泛型接口 封装
<3> WWDC Session & Sample Code
Quick shot:
Protocol and Value Type
Optimizing Swift Performance WWDC 2015 - 409
UITableView SingleCodePath - 基于 Lucid Dreams 及 IGListKit,Swift 实现的 UITableView 封装。
<4> CountDown to WWDC 60 Days
Quick shot: 都是一些有时有用的 tips,像是 @dynamicMemberLookup 关键字和 debug 时的一些调试方法值得记录。
<5> SwifterSwift
Quick shot:
- 在回顾的时候发现一个问题,如果想要实现的 extension 在最小条件的话,就需要熟悉一般性的 protocol 的基本操作。所以,有空的时候列举一下。
- 加上一些时间复杂度低和灵活运用 protocol 内固有的属性。
- 在未看源码的前,拓展一些 protocol
guard startIndex..<endIndex ~= index else { return }
<T: Comparable>
KeyPath<Element, T?>
Element: Hashable
Element: Equatable
@discardableResult
mutating func removeDuplicates() -> [Element] {
self = reduce(into: [Element]()) {
if !$0.contains($1) {
$0.append($1)
}
}
return self
}
BidirectionalCollection - index(before:)
BinaryFloatingPoint
StringProtocol
RandomAccessCollection
RangeReplaceableCollection
<6> iina & Alamofire & Kingfisher
Quick shot: 已经过了一遍,等待精读
<7> SwiftNIO
Quick shot: 已经过了一遍,等待精读
3. Tricks
<1> Protocol
CustomStringConvertible & CustomDebugStringConvertible
Equatable & Hashable
Best practice for value types is to make them Equatable and Hashable
CaseIterable
enum PickerComponent: Int, CaseIterable {
case transitionType
case duration
}
PickerComponent.allCases.count
RangeReplaceableCollection
ExpressibleByDictionaryLiteral
ExpressibleByArrayLiteral
Sequence
Collection
<2> convenience Method
zip
let words = ["one", "two", "three", "four"]
let naturalNumbers = 1...Int.max
let zipped = Array(zip(words, naturalNumbers))
// zipped == [("one", 1), ("two", 2), ("three", 3), ("four", 4)]
uniquingKeysWith
let pairsWithDuplicateKeys = [("a", 1), ("b", 2), ("a", 3), ("b", 4)]
let firstValues = Dictionary(pairsWithDuplicateKeys,
uniquingKeysWith: { (first, _) in first })
// ["b": 2, "a": 1]
let lastValues = Dictionary(pairsWithDuplicateKeys,
uniquingKeysWith: { (_, last) in last })
// ["b": 4, "a": 3]
isDisjoint
let employees: Set = ["Alicia", "Bethany", "Chris", "Diana", "Eric"]
let visitors: Set = ["Marcia", "Nathaniel", "Olivia"]
print(employees.isDisjoint(with: visitors))
// Prints "true"
<3>
状态机
public enum State {
case initialized, resumed, suspended, cancelled
/// Determines whether `self` can be transitioned to `state`.
func canTransitionTo(_ state: State) -> Bool {
switch (self, state) {
case (.initialized, _): return true
case (_, .initialized), (.cancelled, _): return false
case (.resumed, .cancelled), (.suspended, .cancelled),
(.resumed, .suspended), (.suspended, .resumed): return true
case (.suspended, .suspended), (.resumed, .resumed): return false
}
}
}
optional switch
private func allCallbacks() -> [Element] {
switch (self.firstCallback, self.furtherCallbacks) {
case (.none, _):
return []
case (.some(let onlyCallback), .none):
return [onlyCallback]
case (.some(let first), .some(let others)):
return [first] + others
}
}
context 确定,可以用 . 调用类方法
public static let defaultAcceptLanguage: HTTPHeader = {
.acceptLanguage(Locale.preferredLanguages.prefix(6).qualityEncoded)
}()
初始化用尾随 closure 简洁
public typealias Transformer = (CIImage) -> CIImage?
public struct Filter {
let transform: Transformer
public init(transform: @escaping Transformer) {
self.transform = transform
}
}
let f = Filter { input in }
defer
lock.lock(); defer { lock.unlock() }
outputStream.open()
defer { outputStream.close() }
UIGraphicsBeginImageContextWithOptions(frame.size, false, 0)
defer {
UIGraphicsEndImageContext()
}
let filteredItems = r.items?.filter { item in
!(r.latestItems?.contains(where: { item.id == $0.id }) ?? false)
}
let i = items.map { (url, str) -> (URL?, String?) in
var string: String? = str
if let index = string?.firstIndex(of: " ") {
string?.replaceSubrange(index...index, with: "\n")
return (url, string)
}
return (url, str)
}
???
func op() {
requestData()
}
func requestData() {
print(#function)
}
func requestData(append: Bool = false) {
print(#function + "append")
}