SwiftUI Notes


Data Flow

State

Property wrapper State只是一个映射, 并不真正开放空间存储变量, 真正的空间开辟是这样的过程:

  • State必须定义在某个ViewA: View中作为成员属性, 不能定义在别的地方, 也不能定义成optional, 也不能定义成static变量.
  • SwiftUI 在ViewA对象生成时, 通过某种和DynamicProperty相关的机制(可能是某种 reflection 机制, 也可能是 compiler synthesize), 根据State中指示的 initial value, 在真正的 view[1] 对象中建立了一份数据, 并把ViewA和其所有State的成员变量作出了 Model -> View 的关联.
  • 之后ViewA.body每次被重新调用 (例如 data change 导致的 update 或者 view 重新出现在屏幕上等) 前, 都会保证 ViewA 中可以访问到的值被更新到与内存中的运行时状态一致, 这样之后访问/操纵该值时, 本质上都是访问了对应的真正的与 view 关联的数据对象.
  • 在 SwiftUI 可以监控到的环境下调用到某个State的 getter 的前提下, 我们只要在任何地方触发这个State的 setter, 就有可能触发获取了 getter 的body的重新调用.
    • State wrap 的类型是非Equatable时, 只要触发 setter, 即触发body被调用.
    • State wrap 的类型遵循Equatable时, 只有触发 setter 时的newValue和旧值不同时, 才会触发body.

注意在非 SwiftUI 体系下, State毫无作用, 甚至基本的 get/set 逻辑都不满足.

State所指示对象的生命期

无论是State, 还是我们自定义的struct ViewA, 本质上都只是 recipe, 不是真正的运行时对象. 真正的运行时对象, 要么被 SwiftUI 很好地隐藏在真正的 runtime view 对象中, 要么在我们自定义的别的 reference type 中(类似下文的ObservableObject).

Read More

Testing in Xcode


References:

  • What’s New in Testing, WWDC 2017, Session 409
    • 异步 testing API 的变化
    • UI Test 支持多 App test
    • UI Test 的 query 性能优化 (需要 programmer 介入)
    • Attachments
  • What’s New in Testing, WWDC 2018, Session 403
    • Code coverage 优化
    • Xcode 新的 Testing 选项
    • 支持并行执行 test
  • Testing Tips & Tricks, WWDC 2018, Session 417
    • 编写 test case 的 best practics
  • Testing in Xcode, WWDC 2019, Session 413
    • review XCTest 基本功能
    • 新增 Test Plans
    • CI 支持综述

Read More

Pointfree.co Notes Ep.#23-25

这里记录了 pointfree.co 上, 以下三期视频的 notes:


zip的本质: 一个映射

最常见的 zip

考虑显然存在这样的映射A, B -> (A, B). 那么对任意一个包含T的结构Struct<T>, 我们一定可以给出映射g: Struct<A> , Struct<B> -> Struct<(A, B)>. 这样的映射gg就是zip.

这里的Struct可以是 Swift 中的许多有意义的结构, 比如:

  • Optional
  • Array
  • function
  • callback function
  • 任意有"包含"关系的 plain structure

例如, 针对Optional, 我们可以实现

1
2
3
4
func zip<A, B>(_ lhs: Optional<A>, _ rhs: Optional<B>) -> Optional<(A, B)> {
guard let a = lhs, let b = rhs else { return nil }
return .some((a, b))
}

Read More