如何取消初始化 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)
我有一个接受发件人的@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)