https://www.hackingwithswift.com/example-code/language/how-to-use-available-to-deprecate-old-apis
// Proposal 1 class MyClass { prepareVideo { self.movePlayhead(to: self.video.lastPlayheadPosition) self.startPlaybackIfNeeded() } } // Proposal 2 class MyClass { prepareVideo { [self] in movePlayhead(to: video.lastPlayheadPosition) startPlaybackIfNeeded() } }
- SwiftUI View 内部的属性只能通过在 View 内部修改的方式更新 UI
struct MyView: View { @State var text: String = "" var body: some View { Text(text) .onTapGesture { // 可以更新 self.text = "Tapping..." } } } struct XXApp: App { var body: some Scene { WindowGroup <MyView> { let view = MyView() DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) { // 无法更新 view.text = "Update text" } return view } } }
如果需要实现在外部修改 SwiftUI View 的元素,需要创建一个 ObservedObject,将其某个属性设置为 Published,再修改这个属性
struct MyView: View { @ObservedObject var viewModel: MyViewModel var body: some View { Text(viewModel.text) } } class MyViewModel: ObservableObject { @Published var text: String = "" } struct XXApp: App { var viewModel: MyViewModel = .init() var body: some Scene { WindowGroup <MyView> { let view = MyView(viewModel: viewModel) DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) { // 可以更新 viewModel.text = "Update text" } return view } }
- 主要流程:https://www.jianshu.com/p/db55bd5f5aeb
- 完善放置流程:https://medium.com/hackernoon/how-to-drag-drop-uicollectionview-cells-by-utilizing-dropdelegate-and-dragdelegate-6e3512327202
- UIDragSession 判断拖拽位置:https://www.jianshu.com/p/2cd8e4a6aa57
@discardableResult in Swift explained: Ignoring return values
| 时间 | 内容 |
|---|---|
| 20200823 | 新增SwiftUI 中的叠放、网格和大纲(WWDC2020) |
| 20220822 | 新增SwiftUI 新功能(WWDC 2020) |
| 20220816 | 新增自定义 Operation 实例 |
| 20220714 | 新增Swift协议 |
| 20220706 | 新增SwiftUI的FixedSize |
| 20220530 | 新增SwiftUI无法预览 |
| 20220329 | 新增SPM加速 |
| 20220223 | 新增SSH连接Git超时 |
| 20210905 | 新增Swift自定义命名空间 |
| 20210818 | 新增UIView |
| 20210818 | 新增App启动速度优化(占位) |
| 20210818 | 新增Bug和修复方法 |
| 20210818 | 新增备忘录 |