【问题标题】:didSet not getting called on every mutation?didSet 没有在每个突变上都被调用?
【发布时间】:2019-02-09 03:14:58
【问题描述】:

我有一个变量,当你设置和变异时,我希望有一个监听器,而 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。有什么想法为什么一个突变在做而另一个没有?

【问题讨论】:

  • 您是否将 print() 添加到日志中?和数?
  • 进行了打印,确实它被称为正确的次数。问题是保护声明中的返回。它应该是一个 continue 否则它只会每次都做第一个。愚蠢的错误。现在关闭这个...

标签: arrays swift didset


【解决方案1】:

问题是守卫中的返回应该是一个继续,否则由于它也是基于 oldValue,它会在第一个元组之后结束执行。

【讨论】:

    猜你喜欢
    • 2018-02-02
    • 1970-01-01
    • 1970-01-01
    • 2019-03-21
    • 1970-01-01
    • 2014-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多