美文网首页
About Swift

About Swift

作者: 钱嘘嘘 | 来源:发表于2019-08-12 10:26 被阅读0次

    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")
    }
    

    相关文章

      网友评论

          本文标题:About Swift

          本文链接:https://www.haomeiwen.com/subject/mlfmdqtx.html