如何取消初始化 Swift 中的变量引用

How do I uninitialize a variable reference in Swift

我有一个接受发件人的@IBAction 函数:UIButton!作为参数。

@IBAction func buttonPress(sender: UIButton!)

在函数的某个时刻,我将发送者复制到另一个之前声明为 UIButton() 的变量

anotherVar = sender

我知道这是对原始发件人的引用,因为 UIButton 是 class

但是在代码的某些位置,我想打破对 sender 和 "reset" anotherVar 的引用到普通的 UIButton()。我该怎么做?

编辑: 我觉得我应该扩展我正在做的事情,也许我做错了......

我有八个按钮,它们都调用同一个 @IBAction 函数,称为 buttonPress()。这个想法是让用户点击一个按钮,查看图像,然后点击另一个按钮(在剩余的七个按钮中)找到匹配的图像。当 buttonPress() 被调用时,代码: 1. 检查这是否是第一个被点击的按钮 - 如果是,则显示按钮图像,然后将发送者分配给另一个变量; - 如果是按下的第二个按钮(即之前单击了另一个按钮),代码将运行匹配以将发件人的图像与上面设置的另一个 Var 的图像进行比较 2. 如果匹配,我 "lock" 按钮,这样如果用户再次点击按钮,匹配逻辑就不会执行 3. 如果没有匹配,我想"clear out" anotherVar 准备另一个匹配任务。我不想 "lock" 按钮,因为可能仍需要单击同一个按钮。

完整代码如下:

@IBAction func buttonPress(发件人:UIButton!){

    var buttonImage = UIImage()
    buttonImage = UIImage(named: listOfImages[sender.tag])!

    if (!imageIsDone[sender.tag] && (sender.tag != buttonToCompare.tag)) {
        // Only execute button logic if match for image not already found and the user isn't tapping the same image
        if (imageAwaitingCheck) {
            // User has made their first image selection, do matching logic on image clicked
            sender.setImage(buttonImage, forState: .Normal)
            if (sender.currentImage == buttonToCompare.currentImage) {
                // Tapped image macthes previously clicked image
                println("Match")

                // "Lock" the buttons as they've been matched
                imageIsDone[sender.tag] = true
                imageIsDone[buttonToCompare.tag] = true
                imageAwaitingCheck = false  
            }
            else {
                // Tapped image does not match previously clicked image
                println("No match")
                imageAwaitingCheck = false
                buttonToCompare.tag = 100 
                // ********ERROR IS HERE*********I forced this so that
                // (sender.tag != buttonToCompare.tag) is true above when
                // the user taps on the first button again after no match is found.
                // However, this is a REFERENCE to the original sender and sets the
                // button tag to 100 which causes the condition to fail and hence
                // tapping button 1, then button 2, no match, then clicking button 1
                // again doesn't execute any of this logic
            }
        }
        else {
            // User has selected this as the first image, simply show it
            sender.setImage(buttonImage, forState: .Normal)
            imageAwaitingCheck = true
            buttonToCompare = sender // I am copying sender to buttonToCompare. Ideally this would create a copy but because UIButton is a class, this is creating a buttonToCompare as a reference
        }

    }

}

只要 anotherVar 被分配为 var,而不是 let,您可以在完成 sender 后简单地执行以下操作:

anotherVar = UIButton()

这会将 "overwrite" anotherVar 的先前值和 "reset" 其 UIButton.

的新实例

但是,如果您访问 anotherVar 的唯一位置是此功能,您可能根本不需要这样做 - 只要您调用 anotherVar = sender,它也将替换使用新的发件人按钮引用上一个按钮。


要在编辑后实现您所描述的效果,您实际上不需要进行大量更改。在此 if 语句中:if (sender.currentImage == buttonToCompare.currentImage) 在最后添加 buttonToCompare = UIButton()。在 else 语句中,做同样的事情而不是改变它的标签。

或者,如果您希望复制发件人,您可以这样做:

let archivedData = NSKeyedArchiver.archivedDataWithRootObject(button)
let buttonCopy = NSKeyedUnarchiver.unarchiveObjectWithData(archivedData)