We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
出现如上图所示的问题
期望结果:
The text was updated successfully, but these errors were encountered:
候选词的位置,也就是顺序是正常的 index 前缀异常 当前选择的候选词不正确
候选词的渲染是通过 ForEach 做的,在使用中,ForEach 要求输入 id 作为唯一标识,当时不求甚解使用 \.self
ForEach
id
\.self
由于上述背景原因,而且并未对出现的bug进行深入的分析,所以一开始认为是 ForEach 的参数 id 使用 \.self 并不对保证唯一导致的。
经过一翻搜索查询,发现: 对于符合 Hashable 的类型,\.self 表示此对象/结构体的 hashValue 字段 对于实现了 Identifiable 的数据类型, \.self 表示对象/结构体的 id 字段
Hashable
hashValue
Identifiable
而候选词的数据类型仅仅是 Hashable 并不 Identifiable
所以一开始解决方案是把候选词类型改为 Identifiable 并声明定义 id = UUID() 以保证生成唯一的标识
id = UUID()
运行测试发现bug被修复 到此,bug被解决,故事本该结束
同样的资料发现,原候选词的 Hashable 类型应该是能正常工作的,也就是能作为唯一标识。原因是结构体的默认hash一致性实现是把结构体中可hash的值一起hash运算得到的,所以不可能会有两个不一样的候选词而hash一致的问题。
为了验证上面的结论,输出候选词的 hashValue 发现,hashValue 确实不一样的
但是同时发现了另一个问题,候选词的执行顺序和 ForEach 的第一个参数竟然不一致,这是什么情况??
经过思考和实验,以及在各种文档的协助下,总算弄明白了 ForEach 的工作模式
View
content
String
再回来分析这个BUG,发现其实也就只有 2.a 这么一个解释。 至于具体为什么候选词 "去、云、支...." 会按照 "支、去、云..." 这样的顺序来渲染? 分析后,猜想是因为在前一个输入的候选词中也出现了 "支" 这个候选词,并且这两个候选词的数据是完全一致的,生成了一样的 hashValue, 所以 ForEach 在实际执行时,把前面刚出现的数据放在了前面执行。 至于为什么方法1也能修复这个问题,原因也在这里。在使用UUID作为唯一标识的情况下, 即使两个相同的候选词,ForEach 中也认为是不一样的,所以自然不会有因为前面出现过某个数据而把这个数据提前的优待,所以重排后的顺序就会仍然和输入时一致。
2.a
再回来解决这个问题,主要就是因为生成的 index 是一个外部变量,在 content 回调中执行 index += 1 的操作
index += 1
所以在 ForEach 的 content 并不按照输入顺序调用的情况下,出现了index的错乱。
明白了原因,就会发现方法1并不是最完美的解决方案——如果我们后面要在ForEach里面做动画,采用方法1就可能会导致不可预期的结果,在没搞明白 ForEach 工作原理的情况下,方法1等于是埋了一个坑。
那我们如何来完美的解决这个问题呢?其实只需要候选词的index不受 ForEach 的影响就行了,比如说直接放在候选词数据中是一个方案,更好的方案在于,swift数组已经为我们提供了这样的一个方案——enumerated方法,此方法会生成一串包含 (index, element)的元组,这样最终的解决方案如下:
Sorry, something went wrong.
qwertyyb
Successfully merging a pull request may close this issue.
出现如上图所示的问题
期望结果:

The text was updated successfully, but these errors were encountered: