排序
动画(三) – 动画协议
SwiftUI 属性动画系统的核⼼是 Animatable 协议。这个协议可以被视图和视图修饰符所实现,它们通过该协议把可以进⾏动画的属性暴露给SwiftUI。 这个协议唯⼀的要求是⼀个 animatableData 属性,...
动画(二) – 控制动画
在 SwiftUI 中,有多种⽅式可以指定动画发⽣地时机 当某个特定的值改变时,触发隐式动画。 当某个特性事件发⽣时,触发显示动画。 动画类型 隐式动画 要指定隐式动画,可以在视图树的任意位置使...
布局(六) – Layout 协议
Layout 协议,可以创建⾃定义的容器视图,让它们根据所编写的算法来布局⼦视图。这个协议的使用分为两步:⾸先,使⽤ sizeThatFits ⽅法确定容器的尺⼨。在该⽅法内部,我们通过⼦视图的代理,来...
布局(七) – 基于首选项的布局
几何读取器使⽤⼏何读取器 (GeometryReader),我们可以测量被建议的尺⼨。⼏何读取器⽆条件接受被建议尺⼨,并通过⼀个⼏何代理 (GeometryProxy) 将该尺⼨报告给它的视图构建器闭包。通过⼏何代...
布局(八) – 坐标空间
Framework 为我们提供两种内置的坐标空间: 全局坐标空间 和 本地坐标空间,我们也可以定义⾃⼰的坐标空间。struct ContentView: View { var body: some View { VStack { Text('Hello') Text('Se...
模式(一) – MVVM
MVVM 工作原理 MVVM - 模型、视图、ViewModel,理解 MVVM 的最佳方式是这样的:除了创建一个新类 ViewModel 负责将模型中的数据转换为视图中的格式化值之外,它与 MVC 别无二致。 MVVM 模式由三...
错误
错误基础知识 所有要抛出的错误都必须是符合Error协议的枚举。 enum PasswordError: Error { case empty case short } 错误可以添加关联值 enum PasswordError: Error { case empty case short ...
函数与闭包
可变函数 可变函数是一种不确定迭代的函数,也就是你发送多少参数,它就接受多少参数。 func add(numbers: Int...) -> Int { var total = 0 for number in numbers { total += number } retu...
引用类型和值类型
两者区别 布尔、数字、字符串、数组、字典、结构体等都是 Swift 中的值类型。类是引用类型,闭包也是引用类型。 引用类型在分配时是共享的,指向同一条数据,可以有多个所有者;值在分配时是复...