SKSpriteNode名称为int

时间:2018-03-14 11:12:58

标签: swift sprite-kit optional skspritenode

我试图将SKSpriteNode项名称转换为Int ...

代码:

let item = SKSpriteNode(imageNamed: "enemy")
item.name = "1"

然后,在touchesEnded

guard let touch = touches.first else { return }
let location = touch.location(in: self)
let touchedSKSpriteNode = self.atPoint(location)

processItemTouched(node: touchedSKSpriteNode as! SKSpriteNode)

func processItemTouched尝试提取被触摸元素的名称并将其转换为Int:

func processItemTouched(node: SKSpriteNode) {
    let num: Int =  Int(node.name)  // Error
}

但是有一个错误:"可选类型的值' Int?'没有打开;你的意思是使用'!'或'?'?"

点击修复后,它变为:

let num: Int =  Int(node.name)!   // Error, again

但是出现了另一个错误:"可选类型的值'字符串?'没有打开;你的意思是使用'!'或'?'?"

最后,它在修复后正在工作:

let num: Int =  Int(node.name!)!

它有效但存在问题:如果我尝试验证是否num != nil,Xcode会说"比较类型的非可选值' Int' nil总是返回true"。

有没有办法避免这种警报?

2 个答案:

答案 0 :(得分:1)

这是一个棘手的情况,因为节点的名称和会话的结果都可以是nil。

我建议使用??为名称提供默认值,强行展开!选项是非常不优雅和危险的(如果节点没有名称并且您尝试使用这个功能,你的应用程序将崩溃)。

你应该:

  • num声明为可选(明确地或完全省略该类型):

    let num = Int(node.name ?? "") //Int?
    
  • num提供默认值

    let num = Int(node.name ?? "") ?? 0 //Int
    

Learn more about optionals here.

答案 1 :(得分:0)

您正在使用Int类型construtor Int?(String),这意味着它需要String并返回可选的IntInt?)。

node.nameSKNode的可选属性,因为节点没有名称。所以你被建议强制解除引用(但这非常危险)。您可以提供默认值node.name ?? <default>或使用if-let:

if let name = node.name {
   // do something with name in the case it exists!
}

然后您尝试将Int?存储在Int类型的变量中,并且IDE建议您强制取消引用它(这也是一件坏事)。您可以再次提供默认值let i : Int = Int(node.name ?? "0") ?? 0或使用if-let模式:

if let name = node.name, let i = Int(name) {
   // do want you want with i and name...
} else {
   // something bad happened
}