About Swift

字数 1667阅读 15

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. 介绍
    <1> Swift 是什么样的语言,与其他语言的相似之处,定义了值,变量,引用,常量。
    <2> 为了避免引用的浅复制,引入了“写时复制”这种高效的深复制技术。
    <3> 闭包、柯里化函数、静态派发、动态派发、重写、重载、多态的定义。
    <4> Swift API 设计准则

  2. 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。RangeExpression

  3. Sequence_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 + RangeReplaceableCollection

  4. Optional
    <1> Optional chaining + ?? + Optional map/flatMap(与 if let 与 chaining) + Sequence flatMap
    <2> 可选值判等 + fatalError & assert & precondition
    <3> 隐式解包可选值

  5. Struct_Class
    <1> 两者不同点。mutating 与 inout
    <2> 写时复制及实现及陷阱(字典访问与下标访问)
    <3> weak & unowned

  6. Encoding_Decoding
    <1> Encodable & Decodable + 自动遵循 & 编解码过程
    <2> Encoder & KeyedContainer & UnkeyedContainer & SingleValueContainer
    <3> 编译器生成的代码 - CodingKeys: CodingKey + encode(to:) + init(from:)
    <4> 手动遵守协议 - 自定义 Coding Keys & 自定义 encode(to:) 和 init(from:)
    <5> 他人的代码 & 类 & 枚举 满足 Codable

  7. Function
    <1> SortDescriptor 实现 - 泛型 & Comparable & ComparisonResult & combine & <||> & 可选值
    <2> merge 函数进化 + 函数作为代理
    <3> willSet & didSet 与 KVO + lazy
    <4> 下标(泛型) + 键路径(SortDescriptor)(可写键路径(双向绑定) + 键路径层级)
    <5> @autoclosure + @escaping

  8. String
    <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) 类型

  9. Error
    <1> Result 类型 + do/catch & throws
    <2> rethrows + defer + try?

  10. Generics
    <1> 自由函数的重载 + 运算符的重载 + 泛型约束重载(最小条件抽象) + 闭包对行为进行参数化(闭包判等)
    <2>集合泛型 - (泛型)二分查找 + 集合随机排列
    <3> 泛型 - 代码设计 + 共通功能 + 泛型数据类型
    <4> 泛型的工作方式 + 特化 + 全模块优化

  11. Protocol
    <1> 接口抽象 + 关联类型 + extension + 类型约束 & 独立的类型
    <2> protocol 与 继承 + 协议方法的动/静态派发
    <3> 类型抹消 - 简单方法 与 标准库通过类继承把类型隐藏在子类
    <4> 不透明/类存在容器 + 目击表
    <5> 泛型参数 比 协议类型高效得多

  12. 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:

  1. 在回顾的时候发现一个问题,如果想要实现的 extension 在最小条件的话,就需要熟悉一般性的 protocol 的基本操作。所以,有空的时候列举一下。
  2. 加上一些时间复杂度低和灵活运用 protocol 内固有的属性。
  3. 在未看源码的前,拓展一些 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")
}

推荐阅读更多精彩内容