Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 特定方法中Xcode的编译速度较慢_Swift_Xcode - Fatal编程技术网

Swift 特定方法中Xcode的编译速度较慢

Swift 特定方法中Xcode的编译速度较慢,swift,xcode,Swift,Xcode,我使用的是Xcode 8.2.1,上一个项目的编译速度非常慢。我花了一些时间研究为什么会发生这种情况,并开始跟踪我的项目的编译时间。因此,主要问题似乎在这里: 49609.4ms编译moveIcons() 这让我有点吃惊,因为moveIcons()并不是一个真正广泛的方法: func moveIcons(_ motion : SlideMotion) { var direction : CGFloat = 1 if motion == .Out { directi

我使用的是Xcode 8.2.1,上一个项目的编译速度非常慢。我花了一些时间研究为什么会发生这种情况,并开始跟踪我的项目的编译时间。因此,主要问题似乎在这里:

49609.4ms编译moveIcons()

这让我有点吃惊,因为moveIcons()并不是一个真正广泛的方法:

func moveIcons(_ motion : SlideMotion) {
    var direction : CGFloat = 1
    if motion == .Out {
        direction = -1
    }
    for icon in 0...3 {
        let currentIcon = pauseIcons[icon]
        var moveAction = SKAction.sequence([SKAction.move(by: CGVector(dx: (-scene.size.width * direction * 0.26) - (scene.size.width * 0.18 * direction), dy: 0), duration: 0.2), SKAction.move(by: CGVector(dx: scene.size.width * direction * 0.18, dy: 0), duration: 0.1)])
        if icon == 3 {
            moveAction = SKAction.sequence([SKAction.move(by: CGVector(dx: -scene.size.width * direction, dy: 0), duration: 0.3), SKAction.move(by: CGVector(dx: scene.size.width * direction * 0.25, dy: 0), duration: 0.15)])
        }
        currentIcon.run(moveAction)
    }
}
*PauseCons的初始化如下:(它可能包含4个对象)

现在我想可能是因为类型推断减慢了构建速度。因此,我这样做:

func moveIcons(_ motion : SlideMotion) {
    var direction : CGFloat = 1
    if motion == .Out {
        direction = -1
    }
    for icon in 0...3 {
        let currentIcon : SKSpriteNode = pauseIcons[icon]
        var moveAction : SKAction = SKAction.sequence([SKAction.move(by: CGVector(dx: (-scene.size.width * direction * 0.26) - (scene.size.width * 0.18 * direction), dy: 0), duration: 0.2), SKAction.move(by: CGVector(dx: scene.size.width * direction * 0.18, dy: 0), duration: 0.1)])
        if icon == 3 {
            moveAction = SKAction.sequence([SKAction.move(by: CGVector(dx: -scene.size.width * direction, dy: 0), duration: 0.3), SKAction.move(by: CGVector(dx: scene.size.width * direction * 0.25, dy: 0), duration: 0.15)])
        }
        currentIcon.run(moveAction)
    }
}
但是,编译时间仍然是我项目的最高时间:


有人知道为什么这个特殊的方法要花这么多时间编译吗?

这个表达式和相关的表达式非常复杂:

var moveAction = SKAction.sequence([SKAction.move(by: CGVector(dx: (-scene.size.width * direction * 0.26) - (scene.size.width * 0.18 * direction), dy: 0), duration: 0.2), SKAction.move(by: CGVector(dx: scene.size.width * direction * 0.18, dy: 0), duration: 0.1)])
用中间变量分解这些变量。问题不在于找出最终的类型。问题是如何解决
*
-
的所有可能性。是的,只有一种有效的可能性,但是编译器必须检查每一种可能的类型组合,以确保表达式没有歧义。特别是,它必须做大量的工作来决定
0.26
是否应该是
CGFloat
Float
,或者
Double

更大致的是:

for icon in 0...3 {
    let currentIcon : SKSpriteNode = pauseIcons[icon]

    let moveAction: SKAction

    if icon == 3 {
        let moveBy1 = CGVector(dx: -scene.size.width * direction, dy: 0)
        let moveBy2 = CGVector(dx: scene.size.width * direction * 0.25, dy: 0)
        moveAction = SKAction.sequence([
            SKAction.move(by: moveBy1), duration: 0.3),
            SKAction.move(by: moveBy2, duration: 0.15)])
    } else {
        let moveBy1 = CGVector(dx: (-scene.size.width * direction * 0.26) - (scene.size.width * 0.18 * direction), dy: 0)
        let moveBy2 = CGVector(dx: scene.size.width * direction * 0.18, dy: 0)
        moveAction = SKAction.sequence([SKAction.move(by: moveBy1, duration: 0.2),
                                        SKAction.move(by: moveBy2, duration: 0.1)])
    }
    currentIcon.run(moveAction)
}

这个表达式和相关的表达式非常复杂:

var moveAction = SKAction.sequence([SKAction.move(by: CGVector(dx: (-scene.size.width * direction * 0.26) - (scene.size.width * 0.18 * direction), dy: 0), duration: 0.2), SKAction.move(by: CGVector(dx: scene.size.width * direction * 0.18, dy: 0), duration: 0.1)])
用中间变量分解这些变量。问题不在于找出最终的类型。问题是如何解决
*
-
的所有可能性。是的,只有一种有效的可能性,但是编译器必须检查每一种可能的类型组合,以确保表达式没有歧义。特别是,它必须做大量的工作来决定
0.26
是否应该是
CGFloat
Float
,或者
Double

更大致的是:

for icon in 0...3 {
    let currentIcon : SKSpriteNode = pauseIcons[icon]

    let moveAction: SKAction

    if icon == 3 {
        let moveBy1 = CGVector(dx: -scene.size.width * direction, dy: 0)
        let moveBy2 = CGVector(dx: scene.size.width * direction * 0.25, dy: 0)
        moveAction = SKAction.sequence([
            SKAction.move(by: moveBy1), duration: 0.3),
            SKAction.move(by: moveBy2, duration: 0.15)])
    } else {
        let moveBy1 = CGVector(dx: (-scene.size.width * direction * 0.26) - (scene.size.width * 0.18 * direction), dy: 0)
        let moveBy2 = CGVector(dx: scene.size.width * direction * 0.18, dy: 0)
        moveAction = SKAction.sequence([SKAction.move(by: moveBy1, duration: 0.2),
                                        SKAction.move(by: moveBy2, duration: 0.1)])
    }
    currentIcon.run(moveAction)
}

Swift的一个众所周知的问题是,具有深度嵌套表达式的编译速度慢。(你试过最新版本的Xcode吗?)注释左值不会有什么坏处,但它对每行的其他十几个推论都没有帮助。例如,在第8行中,您正在执行8个算术运算,而您只需要执行2个运算。Swift的一个已知问题是使用深度嵌套的表达式时编译速度慢。(你试过最新版本的Xcode吗?)注释左值不会有什么坏处,但它对每行的其他十几个推论都没有帮助。例如,在第8行中,您正在执行8个算术运算,而您只需要执行2个。将尝试执行该操作并运行另一次扫描。谢谢你的建议。我会让你知道它是如何进行的。我会简化
(-scene.size.width*direction*0.26)-(scene.size.width*0.18*direction)
——如果你只合并公共因子,这可能是操作数的一半。因此,我会计算
scene.size.width*direction
一次,因为它使用了很多地方。这个答案,和你的评论一起@Ssswift是一个救命稻草。我还将所有这些文本(如0.26)转换为CGFloat(0.26),并提供了很多帮助。我将尝试并运行另一次扫描。谢谢你的建议。我会让你知道它是如何进行的。我会简化
(-scene.size.width*direction*0.26)-(scene.size.width*0.18*direction)
——如果你只合并公共因子,这可能是操作数的一半。因此,我会计算
scene.size.width*direction
一次,因为它使用了很多地方。这个答案,和你的评论一起@Ssswift是一个救命稻草。我还将所有这些文本(如0.26)转换为CGFloat(0.26),并提供了很多帮助。