Swift3 在Tictaoe中切换播放器

Swift3 在Tictaoe中切换播放器,swift3,xcode8.1,Swift3,Xcode8.1,这段代码不是我自己的,我跟踪了一段youtube视频 我对下面的代码有一个问题,并将其缩小到一个特定的部分和问题 首先,这里是代码: import UIKit class ViewController: UIViewController { var activePlayer = 1 // cross var gameState = [0,0,0,0,0,0,0,0,0] @IBAction func action(_ sender: AnyObject) { if (gameSta

这段代码不是我自己的,我跟踪了一段youtube视频

我对下面的代码有一个问题,并将其缩小到一个特定的部分和问题

首先,这里是代码:

import UIKit

class ViewController: UIViewController {

var activePlayer = 1 // cross
var gameState = [0,0,0,0,0,0,0,0,0]

@IBAction func action(_ sender: AnyObject)
{
    if (gameState[sender.tag] == 0)
    {
        gameState[sender.tag] = activePlayer

        if (activePlayer == 1)
        {
            sender.setImage(UIImage(named: "Cross.png"), for: UIControlState())
            activePlayer = 2
        }
        else
        {
            sender.setImage(UIImage(named: "Nought.png"), for: UIControlState())
            activePlayer = 1
        }
    }

}
主要问题是我不理解gameState[sender.tag]部分。当我运行程序时,第一次单击任何按钮都不会产生任何效果,接下来的单击会根据需要放置一个cross.png。 放置第一个十字后,单击不会产生任何结果。十字架不改变,也没有任何一个空白按钮变成十字架或调皮。

在视频教程中,他指示在[sender.tag]的末尾添加“-1”,如下所示:gameState[sender.tag-1],但是,当我试图在程序运行时单击按钮时,这样做会导致错误。因此,我删除了该部分,程序运行,但出现了上述情况

一般来说我只是一个新手,只在社区学院完成了C++课程的介绍,现在学习SWIFT 3作为一种爱好,所以我可能缺少一些基本的信息,可以很容易地解释这种情况。
感谢您提前向社区表示感谢,您容忍了这种情况的可能性,这完全是因为我的无知,我已经尝试了解sender.tag和其他一些内容,但几天都没有效果。我希望我能从这种情况中学习,并感谢任何信息

Martin R.在评论中回答了OP的问题(未初始化
ui按钮
标记)。我想详细介绍一下标签,希望对您有所帮助

iOS/OSX编程中的标记只是分配给视图的整数标识符。这完全取决于你是否使用它们。未设置标记默认为零

UIControl
s及其所有子类(包括
UIButton
s)使用目标动作设计模式。此模式通过向控件分配一个方法(操作)来工作,当用户与控件交互时,该方法在特定对象(目标)上被调用。可以为控件支持的每种类型的交互指定不同的操作方法(例如,按钮上的触碰操作可以与触碰操作区分开来)

当调用动作方法时,它将接收发生交互的
UIControl
实例作为其第一个参数。按照惯例,此参数称为
发送方
(这是有意义的,因为控件正在“发送”发生某些交互的通知)

现在考虑九代码> UIButton < /代码> S在一个TiC Tac趾网格中。由于所有按钮都具有相同的点击行为,因此让它们在视图控制器上调用相同的操作方法是很方便的。在OP的问题中,action方法实际上是一个名为

action(\uSender:)
(最好是更具描述性的函数,例如
squareTapped(\uSender:UIButton)
,但我离题了)

如果按钮没有全部调用相同的操作方法,那么您将不得不面对像
upperLeftCornerTapped()
upperMiddleTapped()
等函数的噩梦,所有这些函数都会做同样的事情。从设计和维护的角度来看,这都是非常丑陋的

但这回避了一个问题:既然所有按钮都调用相同的动作方法,我们如何区分哪个按钮被实际点击?这就是标签的作用。设置按钮时,我们为每个按钮分配一个唯一的整数标识符

由于缺省标记为零,所以使用非零标记值是必要的,因此我们保证由标签标识的视图是我们明确认为有效的视图。


为了方便和实用,按钮索引从1开始,一直到9。这为我们提供了一种直接将每个按钮与游戏状态变量关联的方法。在本例中,
tag-1
用于获取可变
gameState
数组中基于零的索引。

我没有观看视频。但是从代码来看,你必须给故事板编辑器中的所有按钮分配标记(1…9)。教程从未经历过这一步,这对他来说很简单,但他确实提到他添加的“-1”与数组一致,因为数组从0开始。。。所以idk,如果他有一些选项,自动编号的按钮或东西,但我从来没有分配标签的按钮,所以我会看看如何做,并返回给你。。。考虑到目前为止我所发现的,它似乎会起作用。谢谢您提供的信息。在按钮上添加标签后,它可以完美地工作。视频从来没有经过那一步。。。Xcode中是否有某种选项可以自动将标签分配给新创建的按钮或其他东西?为了匹配数组集,我不得不在sender.tag的末尾添加“-1”,但现在它工作得很好。非常感谢您提供的信息。我相信您在设置图像时也不应该使用
for:UIControlState()
。而是使用特定的控制状态,例如:.normal。在大约4:20的视频中:“我们将给每个按钮一个标签…”。