是的,它是另一个选项问题...... :(
每当我想我开始很好地掌握选项时,Xcode就会向我提出一个解包的错误修复建议。以下代码块使用所有Xcodes错误修复程序。但我不认为这是正确的做法。
var btAdd = [SKSpriteNode]()
var btLose = [SKSpriteNode]()
...
let touchedNodes = self.nodes(at: pos)
for node in touchedNodes{
if btAdd.contains((node as? SKSpriteNode)!) {
let index = Int(String(describing: node.name?[(node.name?.endIndex)!]))
node.isHidden = true
btLose[index!].isHidden = false
var dogTeam = defaults.array(forKey: "dogTeam") as! [Int]
dogTeam.append(index!)
defaults.set(dogTeam,forKey: "dogTeam")
}
}
我开始做......
if let node as? SKSpriteNode{
if btAdd.contains(node){
...
}
}
但我也不确定。
我正在寻找关于绝对"正确"的一些指导。方法来做这个代码块。不仅仅是.contains
部分,还包括index
和UserDefaults数组的展开。
答案 0 :(得分:1)
实际上,代码的最后一部分看起来很好。它只是需要稍微调整的第一部分。而你正在开始做的事情"很好,但这是另一个版本:
for node in touchedNodes where node as? SKSpriteNode != nil &&
btAdd.contains(node as! SKSpriteNode){
如果你使用上述内容,你甚至不需要循环中的if语句。
你似乎很困惑在哪里强行打开包装,哪里不要。请记住,当你完全确定你要解开的东西不能为零时,你只能强行打开包装。
这条线看起来很糟糕:
let index = Int(String(describing: node.name?[(node.name?.endIndex)!]))
您似乎想要获取节点名称的最后一个字符并将其转换为int。由于您首先检查了节点是否在数组中,因此我认为强行解包是安全的。 (我假设数组中的所有节点都有一个以数字结尾的名称)另外,要获取最后一个字符,只需执行str.character.last
:
let index = Int(node.name!.characters.last!.description)!
答案 1 :(得分:0)
您还可以将您的选项包装在if语句中,该语句将删除" optionalness"他们每当我引用它时,第一个示例索引变为非可选
if let index = Int(spinButton.name!) {
let something = someArray[index]
}
您的方式...每次引用时,index2始终是可选的
let index2 = Int(spinButton.name!)
let something = someArray[index2!]