【问题标题】:Two swift functions increasing compiling time dramatically两个 swift 函数显着增加编译时间
【发布时间】:2017-06-28 21:25:00
【问题描述】:

返回并阅读我的应用程序的构建日志后,似乎存在一个奇怪的问题,即两个(相对)简单的函数都将编译时间分别增加了一分钟(分别为 58 和 53 秒)。这可以在下面的构建日志中看到:

这些函数在我的 CAAgeViewController 中,并且都引用了我的故事板中的 UISlider。他们确保最大和最小滑块彼此之间最多相差 1 年,并且任一功能都将标签设置为“18-24 年”或其他方面。它们如下:

@IBAction func minAgeChanged(_ sender: UISlider) {
    if round(minAgeSlider.value / 1) < round(maxAgeSlider.value / 1) - 1 {
        minAgeSlider.value = round(minAgeSlider.value / 1)
        ageLabel.text = String(Int(round(minAgeSlider.value / 1))) + "-" + String(Int(round(maxAgeSlider.value / 1))) + " Years"
    } else {
        minAgeSlider.value = round(maxAgeSlider.value / 1) - 1
        ageLabel.text = String(Int(round(minAgeSlider.value / 1))) + "-" + String(Int(round(maxAgeSlider.value / 1))) + " Years"

    }
}

@IBAction func maxAgeChanged(_ sender: UISlider) {
    if round(maxAgeSlider.value / 1) > round(minAgeSlider.value / 1) + 1 {
        maxAgeSlider.value = round(maxAgeSlider.value / 1)
        ageLabel.text = String(Int(round(minAgeSlider.value / 1))) + "-" + String(Int(round(maxAgeSlider.value / 1))) + " Years"
    } else {
        maxAgeSlider.value = round(minAgeSlider.value / 1) + 1
        ageLabel.text = String(Int(round(minAgeSlider.value / 1))) + "-" + String(Int(round(maxAgeSlider.value / 1))) + " Years"
    }
}

我不确定这里到底出了什么问题。任何帮助表示赞赏!

【问题讨论】:

  • 这不可能是减速的原因,但你到底为什么要反复拨打round(slider.value / 1)?当我们讨论这个主题时,/ 1 在它们中的意义何在?这里发生了很多不必要的事情。
  • 你有同样复杂的代码行复制粘贴4次。为什么不创建一个函数?

标签: ios swift uislider


【解决方案1】:

您的问题是连锁加号。 (它总是链式加号;好吧,不是总是,而是总是……)

ageLabel.text = String(Int(round(minAgeSlider.value / 1))) + "-" + String(Int(round(maxAgeSlider.value / 1))) + " Years"

将其替换为:

ageLabel.text = "\(Int(round(minAgeSlider.value)))-\(Int(round(maxAgeSlider.value))) Years"

我相当肯定 /1 在这里没有帮助您。 round + Int 应该尽你所能。

【讨论】:

  • 就是这样-从现在开始我肯定会厌倦链式加号!谢谢!
  • 知道为什么会发生这种情况吗?
  • @shallowThought 因为解析中缀 + 运算符比沿字符串插值段解析要昂贵得多
  • + 上有很多重载。找出您想要的所有类型,然后确定您拥有的任何类型是否可能被强制转换为任何这些类型,这是一个组合爆炸性的问题。例如,"-" 不是字符串。这是一个字符串文字。你可以用它来构造任何ExpressibleByStringLiteral。所以 Swift 必须决定构建哪些东西,然后确定是否有一个 + 函数接受 String 和其他东西。当有两个+运营商时,有很多可能去追逐。
  • / 1 可能也让人头疼。 roundInt.init/ 有很多版本,1 不是“一个 Int”,它是一个整数文字,可以用来再次构造很多东西。你走的每一条路都意味着所有其他类型可能会发生变化,你也必须考虑这些,直到你最终找到一个(看似,但实际上不是“显而易见的”)解决方案。找到一个是不够的。您必须证明它是 only 解决方案,否则表达式不明确。所以“从显而易见的开始”不会节省任何时间。
【解决方案2】:

速度变慢的最可能原因是您将字符串与+ 连接的方式。出于某种我无法弄清楚的原因,使用"\(string1) \(string2)" 附加字符串比使用string1 + string2 快得多(至少在Swift 2/3 中)。数组及其+ 运算符也是如此。当我们更改连接方式时,编译时间减少了 100 倍。

【讨论】:

    【解决方案3】:

    您是否尝试过除以 1 并将值转换为 Double?请注意,他们可能已经是双打了。您可能只需要调用 round()。

    【讨论】:

    • 我试试看
    猜你喜欢
    • 1970-01-01
    • 2012-07-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-03
    • 1970-01-01
    • 1970-01-01
    • 2021-06-06
    • 1970-01-01
    相关资源
    最近更新 更多