如何根据另一个 var 检查数组的内容,通过 if 语句利用警报窗口?
Posted
技术标签:
【中文标题】如何根据另一个 var 检查数组的内容,通过 if 语句利用警报窗口?【英文标题】:How to check array for contents based off another var, utilize alert window through if statement? 【发布时间】:2018-04-24 22:27:52 【问题描述】:我目前正在开发一个小型 Bingo 应用程序。不过,我遇到了一些问题。
首先,我有一个按钮,单击该按钮时,会更改显示该作品已标记的图像(旨在标记已被调用的数字)。我有一个 if 语句如下:
if BOneButton.isSelected && IOneButton.isSelected && NOneButton.isSelected && GOneButton.isSelected && OOneButton.isSelected
winConditionLabel.text = "You win!"
func createAlert(_ sender: UIButton)
let alert = UIAlertController(title: "Bingo!", message: "You win!", preferredStyle: .alert)
let action1 = UIAlertAction(title: "Play Again?", style: .default) (action) in
self.NewBoardAction(sender)
self.dismiss(animated: true, completion: nil)
alert.addAction(action1)
present(alert, animated: true, completion: nil)
我对此有一些问题。首先,警报窗口不会出现。我做错了什么吗? (这是我第一次尝试使用 Alerts,所以很有可能。)其次,我一直用来测试以确保程序首先通过 if 语句的标签,只有在取消选择后才会更新行中的最后一个按钮。这是我现在要解决的主要问题。最后,我在检查 calledNumbers 数组时遇到了问题(该数组正是由该数组组成 - 所有已调用的数字)以确保已调用已选择的数字。
我原来是这样的:
if BOneButton.isSelected && IOneButton.isSelected && NOneButton.isSelected && GOneButton.isSelected && OOneButton.isSelected && calledNumbers.contains(Int(randomBOne.text)) && calledNumbers.contains(Int(randomIOne.text)) && calledNumbers.contains(Int(randomNOne.text)) && calledNumbers.contains(Int(randomGOne.text)) && calledNumbers.contains(Int(randomOOne.text))
// do stuff here
但这根本行不通。有一个更好的方法吗?我真的很感激任何帮助!
关于检查数组的问题。这是第一个字母的代码。其他人基本上做同样的事情:
@IBAction func newNumberAction(_ sender: Any)
// B NUMBERS
let randomLetter = ["B", "I","N","G","O"]
let randomIndex = Int(arc4random_uniform(UInt32(randomLetter.count))) // Gives random number from 0 - 4
if (randomLetter[randomIndex]) == (randomLetter[0]) // if statement for each index/letter possibility
let randomBIndex = Int(arc4random_uniform(UInt32(listBNumbers.count))) // listBNumbers is the original array that randomizes a number from 1 - 15
if randomBIndex < 1 // makes sure there are still B numbers remaining and if not runs the newNumberAction again
newNumberAction((Any).self)
else
let newBNumber = "\(listBNumbers[randomBIndex])" // creates unique variable for random BNumbers
let combinedNumber = (randomLetter[0]) + newBNumber
var calledBNumbers = [Int]() // creates array for called BNumbers
calledBNumbers.append(Int(newBNumber)!) // adds called B Number into new array
listBNumbers.remove(at: (Int(randomBIndex))) // removes B Number from bank of possible numbers that could be called, this should ensure that no number can be called twice
calledNumbers += calledBNumbers // adds called B Numbers to new array that will be used later to verify BINGO
newNumLabel.text = combinedNumber
// this randomizes the number and combines it with 'B' then displays it in the label's text. This is used to display the next called Number.
我通过检查一个标签来知道附加工作正常,该标签为我提供了 calledNumbers 数组中的变量计数。再次,我很抱歉我最初没有提供足够的信息。
【问题讨论】:
警报不会出现,因为您在 if 语句中声明了函数。在 if 语句之外创建它,然后在 if 语句中调用它 【参考方案1】:您的第一个问题不会出现警报,因为您在 if 语句中声明了函数。在 if 语句之外创建它,然后在 if 语句中调用它
您的第二个问题在代码中没有包含足够的上下文以供任何人帮助您解决。除了你自己,其他人怎么会知道“行中的最后一个按钮”是什么?
您的最后一个问题与第二个问题的问题相同,“我在检查 calledNumbers 数组时遇到问题”。您的问题中没有数组,那么谁能帮助您确定问题?
这应该可以解决您的第一个问题:
if BOneButton.isSelected && IOneButton.isSelected && NOneButton.isSelected && GOneButton.isSelected && OOneButton.isSelected
winConditionLabel.text = "You win!"
createAlert() // now that this inside of the if statment it will run
// this should be declared outside of the if statement
func createAlert()
let alert = UIAlertController(title: "Bingo!", message: "You win!", preferredStyle: .alert)
// your alert's code
您添加了数组信息,但仍然没有足够的上下文。根据我假设你想要的,这是我能做的最好的。您的代码仍然不够清晰。您应该已经添加了所有带有 foo 信息的数组。现在我添加了一个数组var listBNumbers = ["X", "Y", "Z"]
和X,Y,Z
作为listBNumbers
值在你的代码中使用,因为你没有提供任何东西。
var listBNumbers = ["X", "Y", "Z"]
let randomLetter = ["B", "I","N","G","O"]
/*
// YOUR ORIGINAL CODE
let randomIndex = Int(arc4random_uniform(UInt32(randomLetter.count)))
*/
// 1. TEMPORARILY set this to 0 so that if statement below will run. Delete this and uncomment out your original code above when finished
let randomIndex = 0
if randomLetter[randomIndex] == randomLetter[0]
/*
// YOUR ORIGINAL CODE
// randomIndex is of type INT there is no need to cast it as Int again in step 7B when your removing it from the listBNumbers array
let randomBIndex = Int(arc4random_uniform(UInt32(listBNumbers.count)))
*/
// 2. TEMPORARILY set this to 2 so that the else statement below will run. Delete this and uncomment out your original code above when finished
let randomBIndex = 2
if randomBIndex < 1
// I have no idea what this is
newNumberAction((Any).self)
else
// 3. newBNumber is now: Z
let newBNumber = "\(listBNumbers[randomBIndex])"
print("newBNumber: \(newBNumber)")
// 4. combinedNumber is now: BZ
let combinedNumber = randomLetter[0] + newBNumber
print("combinedNumber: \(combinedNumber)")
// 5. THIS IS AN ARRAY of type INT it will not accept Strings
var calledBNumbers = [Int]()
// 6A. newBNumber is of type STRING not a type INT. This line below CRASHES because what your saying is calledBNumbers.append(Int(Z)!). How can you cast a Z to an Int?
calledBNumbers.append(Int(newBNumber)!) // newBNumber contains the letter Z
// 6B. THIS IS MY ASSUMPTION seems like you wan to use
calledBNumbers.append(randomBIndex)
print("calledBNumbers: \(calledBNumbers.description)")
// 7A. check to see if the index your looking for is inside the listBNumbers array
if listBNumbers.indices.contains(randomBIndex)
// 7B. randomBIndex is ALREADY of type Int. Why are you casting it >>>Int(randomBIndex)
listBNumbers.remove(at: randomBIndex)
print("listBNumbers: \(listBNumbers.description)")
// 8. There is no context for me to even try and figure out what calledNumbers is so I can't give you any info about it
calledNumbers += calledBNumbers
// combinedNumber contains: BZ from the step 4 so that is what your newNumLabel.text will show
newNumLabel.text = combinedNumber
这是一种清理此代码的方法,使其更具可读性。您需要将所有这些分解为更小的函数,以便其更具可读性:
if areButtonsSelected() == true && doesCalledNumbersContainBingo() == true
// do stuff here
func areButtonsSelected() -> Bool
if BOneButton.isSelected && IOneButton.isSelected && NOneButton.isSelected && GOneButton.isSelected && OOneButton.isSelected
return true
return false
func doesCalledNumbersContainBingo() -> Bool
let b = Int(randomBOne.text)
let i = Int(randomIOne.text)
let n = Int(randomNOne.text)
let g = Int(randomGOne.text)
let o = Int(randomOOne.text)
if calledNumbers.contains(b) && calledNumbers.contains(i) && calledNumbers.contains(n) && calledNumbers.contains(g) && calledNumbers.contains(o)
return true
return false
【讨论】:
你是对的。我很抱歉没有提供足够的信息。感谢您,我设法解决了警报问题。我也解决了第二个问题。至于第三个,我将用更好的描述更新我的问题。 我看了一眼。使用此语句“if (randomLetter[randomIndex]) == (randomLetter[0])”您会说“如果具有生成索引的 randomLetter 的索引等于 randomLetter 数组的第一个索引”但您有评论说说“//每个索引/字母可能性的if语句”。这个 if 语句只有 1 种可能起作用。它运行的唯一方法是常量 randomIndex 生成 0。如果它生成除 0 以外的任何内容,那么您的 if 语句将不会运行。你明白吗? if "let randomIndex = Int(arc4random_uniform(UInt32(randomLetter.count)))" 生成除 0 以外的任何数字 then "if (randomLetter[randomIndex]) == (randomLetter[0])"不会跑。所以基本上如果“让 randomIndex = ... 返回 1”然后“如果 (randomLetter[1]) == (randomLetter[0])”这是不正确的,所以它不会运行。你必须记住 randomLetter[randomIndex] // randomIndex 包含一个 1 另外,您有一条评论说“listBNumbers 是从 1 到 15 随机化一个数字的原始数组”。如果这是一个包含 15 个对象的普通数组,那么计数是 15,但它会从 0 - 14 而不是 1 -15 随机化。数组从索引 0 开始而不是索引 1。developer.apple.com/library/content/documentation/Swift/… 阅读部分:访问和修改数组 -“注意数组中的第一项索引为 0,而不是 1。Swift 中的数组始终是零索引。” 对我来说,只需在数组部分的每一行上方添加 cmets 就更容易了。阅读 cmets 表格 1 - 8 并在您的实际项目中使用打印语句,这样您就可以看到在控制台中打印出的内容以上是关于如何根据另一个 var 检查数组的内容,通过 if 语句利用警报窗口?的主要内容,如果未能解决你的问题,请参考以下文章
对于在数组中找到零并切换标志+更新另一个数组的循环的SSE优化