如何正确有效地展开这些选项?

时间:2017-03-23 17:09:15

标签: xcode swift3 sprite-kit optional

是的,它是另一个选项问题...... :(

每当我想我开始很好地掌握选项时,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数组的展开。

2 个答案:

答案 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!]