快速切换时在两个变量之间来回切换的最佳方式

问题描述:

我有一个变量gameMode,我想在每次点击屏幕时在垂直和水平之间切换。我遇到的问题是只需要较低的变量,并且gameMode总是显示为水平。我该如何解决这个问题,以便在调用touchesBegan方法时进行切换?任何帮助表示赞赏!快速切换时在两个变量之间来回切换的最佳方式

这里是我有问题的代码:

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 


    if gameMode == "Horizontal" { 

     gameMode = "Vertical" 

    } 


    if gameMode == "Vertical" { 

     gameMode = "Horizontal" 

    } 


    print(gameMode) } 
+0

这可能是你要找的内容https://developer.apple.com/library/content/documentation/General/Conceptual/GameplayKit_Guide/StateMachine.html#//apple_ref/doc/uid/TP40015172-CH7- SW1 – 0x141E

这是因为,如果gameMode"Horizontal",你设置gameMode"Vertical"gameMode == "Vertical"回报true后,让你设置gameMode"Horizontal"

试试这个代码:

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
    if gameMode == "Horizontal" { 

     gameMode = "Vertical" 
    } else { 
     gameMode = "Horizontal" 
    } 

    print(gameMode) 
} 

您应该使用enum而不是字符串。

实施例:

enum GameMode { 
    case horizontal 
    case vertical 

    mutating func toggle() { 
     self = self == .horizontal ? .vertical : .horizontal 
    } 
} 

var gameMode: GameMode = .horizontal 

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
    gameMode.toggle() 
    print(gameMode) 
} 
+0

为方便起见,您也可以在该枚举上做一个变异的func toggle()。 – Simon

可以与三元运算

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
    gameMode = gameMode == "Horizontal" ? "Vertical" : "Horizontal" 
    print(gameMode) 
} 

切换两种状态只有两种状态可能是布尔变量比较适合。如果gameModeBool可以简单的写

gameMode = !gameMode 
+0

gameMode - 是Bool值的错误名称。至于我,isHorizo​​ntal或isVertical会更好。但实现它的最好方法是使用枚举GameMode。 –

+0

这个作品也谢谢你! – Justin

+1

由开发人员使用合理的名称。这只是一个建议 – vadian

我将取代

if gameMode == "Horizontal" { 

    gameMode = "Vertical" 

} 


if gameMode == "Vertical" { 

    gameMode = "Horizontal" 

} 

if gameMode == "Horizontal" { 

    gameMode = "Vertical" 

} else { 

    gameMode = "Horizontal" 

} 

有两个如果成一排,语句当您发送 “水平” 为,该值会将其切换到“垂直”。这也将使第二个声明起作用并将其切回。使用if/else将确保它只运行一次。