2017-02-10 41 views
1

我花了很多时间编译生成报告,只是为了弄清楚为什么用Swift3编译Xcode 8.2.1需要很长时间。Swift3:为什么这个简单的代码块需要很长时间才能编译

我发现的一个问题是一个简单的覆盖init函数,其中简单的内容花费大约45秒来进行类型检查/编译。我想不出什么原因。我试图分解成函数,在需要时提供类型,但仍需要很长时间才能编译。

超类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) 
    } 
    ... 

回答

3

斯威夫特的编译器是很慢的,当谈到搞清楚类型,当你混合和匹配了很多。这里的罪魁祸首是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) 
    } 
} 

尝试编译并注意它有多快。然后删除//slowPoint并注意它有多慢。无论什么时候,你都应该尽可能明确地对数学类型进行数学描述。

TL; DR将那些2 s变为CGFloat(2) s为self.startingPoint

相关问题