arrays - didSet 没有在每个突变上都被调用?
问题描述
我有一个变量,我想在你设置和变异时有一个监听器,而 didSet 似乎是完美的候选者。但是,在我对它的初始测试中,第一个附加触发了 do set 并且(在我的示例中)JS 加载到我的 webview 中,但是我从来没有看到第二个附加在 didSet 上命中了我的断点,并且 JS 没有运行,因为它一定没有加载。会发生什么?
var additionalJSFilesToRun: [(String, WKUserScriptInjectionTime)] {
didSet {
for (string, time) in additionalJSFilesToRun {
guard !self.jsFiles.contains(string) else { return }
guard let jsPath = Bundle.main.path(forResource: string, ofType: "js"), let jsSource = try? String(contentsOfFile: jsPath) else { return }
let script = WKUserScript(source: jsSource, injectionTime: time, forMainFrameOnly: false)
self.webView.configuration.userContentController.addUserScript(script)
jsFiles.insert(string)
}
}
}
在另一个班级:
webView.additionalJSFilesToRun.append(("ABC", .atDocumentStart))
webView.additionalJSFilesToRun.append(("DEF", .atDocumentStart))
只有 ABC 触发了 didSet。任何想法为什么一个突变在做而另一个不是?
解决方案
问题是守卫中的返回应该是一个继续,否则由于它也是基于 oldValue 的,它将在第一个元组之后结束执行。
推荐阅读
- php - 使用 php 计算 mysqli DB 中的爆炸字符串
- flask - 使用分页时如何更新值?
- reactjs - 如何在 useEffect 中返回 false 或 true 并将其传递给另一个 useEffect 方法
- ios - iOS 应用程序在使用 FirebaseApp.configure() 时崩溃
- laravel - 设置 SSL (https) 后站点内部链接不起作用
- c - Eclipse 中的 GDB 调试器找不到 FILE
- python - 定时器内部函数
- python - 在python中处理chainer.function.max_pooling_2d时出错
- amazon-web-services - 使用预签名 URL 在 S3 上部分上传
- laravel - DB::Raw() 查询更改 postgres 中的序列在 laravel 中不起作用