SwiftUI按钮未调用isAZ.toggle()却仍能切换排序?
SwiftUI排序异常原因解析
你的代码里isAZ确实始终为false,每次点击按钮都会执行else分支的movies.reverse(),但排序顺序依然变化的核心原因是:reverse()方法会直接反转当前数组的现有顺序,而不是将数组恢复到初始状态。
具体过程:
- 第一次点击:反转初始数组,得到逆序列表;
- 第二次点击:反转已经是逆序的数组,回到初始顺序;
- 后续每次点击都会重复“反转当前数组”的操作,导致排序在初始和逆序之间来回切换。
如果需要实现点击按钮切换A-Z正序/Z-A逆序的功能,必须修改按钮逻辑,同时切换isAZ的状态,并且基于固定的排序基准来切换,而不是依赖当前数组状态反转。比如:
Button("Sorted By") { isAZ.toggle() // 基于排序后的数组切换正逆序,避免依赖当前数组状态 movies = isAZ ? movies.sorted() : movies.sorted().reversed() }
或者保持你原来的结构,补全isAZ的切换:
Button("Sorted By") { isAZ.toggle() if isAZ { movies.sort() } else { // 用sorted().reversed()替代直接reverse(),确保是正序的逆序 movies = movies.sorted().reversed() } }
这样就能实现稳定的正逆序切换,而不是依赖数组当前状态的反转操作。
内容的提问来源于stack exchange,提问作者Steven-Carrot
相关产品推荐
相关产品推荐

