Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift SKSpriteNode名称为int_Swift_Sprite Kit_Optional_Skspritenode - Fatal编程技术网

Swift SKSpriteNode名称为int

Swift SKSpriteNode名称为int,swift,sprite-kit,optional,skspritenode,Swift,Sprite Kit,Optional,Skspritenode,我正在尝试将SKSpriteNode项名称转换为Int 这就是代码: let item = SKSpriteNode(imageNamed: "enemy") item.name = "1" 然后,在接触中: func processItemTouched尝试提取被触摸元素的名称并将其转换为Int: func processItemTouched(node: SKSpriteNode) { let num: Int = Int(node.name) // Error } 但有一个

我正在尝试将SKSpriteNode项名称转换为Int

这就是代码:

let item = SKSpriteNode(imageNamed: "enemy")
item.name = "1"
然后,在接触中:

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

func processItemTouched(node: SKSpriteNode) {
    let num: Int =  Int(node.name)  // Error
}
但有一个错误:可选类型“Int”的值未展开;你想用“!”吗还是“?”

单击“修复”后,它将变为:

let num: Int =  Int(node.name)!   // Error, again
但出现另一个错误:可选类型“String”的值未展开;你想用“!”吗还是“?”

最后,在修复之后,它开始工作:

let num: Int =  Int(node.name!)!
它可以工作,但有一个问题:如果我尝试验证是否num!=nil,Xcode表示,将“Int”类型的非可选值与nil进行比较总是返回true


有没有办法避免此警报?

这是一种棘手的情况,因为节点名称和会话结果都可能为零

我建议使用???为名称提供一个默认值,并使用强制展开可选的!是非常不雅观和危险的,如果一个节点没有名称,而你试图使用此功能,你的应用程序将崩溃

你应该:

将num显式声明为可选值,或完全忽略该类型:

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

您正在使用Int类型construtor Int?String,这意味着它需要一个字符串并返回可选的Int

node.name是SKNode的可选属性,因为节点可以没有名称。因此,有人建议您强制取消引用,但这是非常危险的。您可以提供默认值node.name??或者使用if let:

if let name = node.name {
   // do something with name in the case it exists!
}
然后你试着存储Int?在Int类型的变量中生成,IDE建议您再次强制取消引用它,这是一件坏事。同样,您可以提供一个默认值,让i:Int=Intnode.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
}

你能详细说明一下为什么需要用Int来命名sprite节点吗?听起来应该有一个更优雅的/类型安全的/标准的方法来实现这个目标。什么节点名称会给你的int值“nil”?我正在尝试开发一个用于学习的记忆卡游戏,并为任何卡分配一个累进数作为名称,这看起来是一个节省时间的好主意。。。一个零的值可能会碰到背景图像,我想。。。我可以为场景中的每个节点指定一个名称。。。这可能是一个解决方案吗?不幸的是,这两个建议无法避免将类型“Int”的非可选值与nil进行比较总是返回真正的警报…@Alchemy对于第二个示例,您不应该遇到这个问题,因为num不是可选的-如果节点没有名称或名称无法转换为Int,则num设置为0。
if let name = node.name {
   // do something with name in the case it exists!
}
if let name = node.name, let i = Int(name) {
   // do want you want with i and name...
} else {
   // something bad happened
}