Swift3:为什么这个简单的代码块需要很长时间才能编译

时间:2017-02-10 01:54:20

标签: swift xcode swift3 xcode8

我在构建报告上花了很多时间才弄清楚为什么用Swift3编译Xcode 8.2.1需要很长时间。

我发现的一个问题是一个简单的覆盖初始化函数,简单的内容大约需要45秒来进行类型检查/编译。

我无法弄清楚原因是什么。我试图分成函数,在需要的地方提供类型,但编译仍然需要很长时间。

Superclass MyScene从SKScene开始只是在场景中调用了removeAllActions。

下面是代码:

class LevelSelectionScene: MyScene {
  var gameMode:GameMode
  var levelSelectionLayer:SKNode!
  var screenSize:CGSize!
  var startingPoint:CGPoint!
  var backButton: Button!
  fileprivate var _buttonBg : SKSpriteNode!
  fileprivate var _layerTouched : Bool = false
  fileprivate var _touchPress : Bool = false

  override init(size: CGSize) {
    self.screenSize = UIScreen.main.bounds.size
    self.gameMode = GameMode.Classic
    let tileGap:CGFloat = Constants.Config.LevelSelection.tilegap
    let tileWidth:CGFloat = Constants.Config.LevelSelection.tilewidth
    let numX:CGFloat = screenSize.width / (tileWidth+tileGap)
    self.levelSelectionLayer = SKNode()
    self.levelSelectionLayer.zPosition = 100
    self.startingPoint = CGPoint(x: (-numX*(tileWidth+tileGap))/2+tileWidth/2+tileGap, y: 0)
    super.init(size: size)
  }
  ...

1 个答案:

答案 0 :(得分:3)

当你混音和匹配很多时,Swift的编译器在计算类型时非常慢。这里的罪魁祸首是self.startingPoint的数学运算。它必须与那些2做一些工作。

这是一个很好的例子,你可以投入一个空白的项目。

class LevelSelectionScene {

    init(size: CGSize) {
        let screenSize = CGSize(width: 320, height: 480)
        let tileGap: CGFloat = 10
        let tileWidth: CGFloat = 10
        let numX: CGFloat = screenSize.width / (tileWidth + tileGap)

        // let slowPoint = CGPoint(x: (-numX*(tileWidth+tileGap))/2+tileWidth/2+tileGap, y: 0)

        let fastPoint = CGPoint(x: (-numX * (tileWidth + tileGap)) / CGFloat(2) + tileWidth / CGFloat(2) + tileGap, y: 0)
    }
}

尝试编译并注意它的速度。然后移除//的{​​{1}}并注意它有多慢。每当你在swift中进行数学运算时,尽可能明确地表达类型。

TL; DR将这些slowPoint转换为2的{​​{1}}。