2017-02-10 3 views
1

Xcode 8.2.1でSwift3でコンパイルするのはなぜか時間がかかります。Swift3:この単純なコードブロックでは、コンパイルするのに何年もかかるのですか?

私が見つけた1つの問題は、タイプチェック/コンパイルに約45秒かかる簡単な内容の単純なオーバーライドinit関数です。

私は原因を特定できません。私は関数に分割しようとしましたが、必要なところで型を提供しましたが、それでもコンパイルには時間がかかります。

スーパークラスMySceneはシーンのremoveAllActionsを呼び出す関数を1つだけ持つSKSceneから継承しています。

相続コード:それはあなたが多くを混合し、一致しているときのタイプを考え出すことになると

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 2CGFloat(2)self.startingPointに変換します。

関連する問題