我试图将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"。
有没有办法避免这种警报?
答案 0 :(得分:1)
这是一个棘手的情况,因为节点的名称和会话的结果都可以是nil。
我建议使用??
为名称提供默认值,强行展开!
选项是非常不优雅和危险的(如果节点没有名称并且您尝试使用这个功能,你的应用程序将崩溃)。
你应该:
将num
声明为可选(明确地或完全省略该类型):
let num = Int(node.name ?? "") //Int?
为num
提供默认值:
let num = Int(node.name ?? "") ?? 0 //Int
答案 1 :(得分:0)
您正在使用Int
类型construtor Int?(String)
,这意味着它需要String
并返回可选的Int
(Int?
)。
node.name
是SKNode
的可选属性,因为节点没有名称。所以你被建议强制解除引用(但这非常危险)。您可以提供默认值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
}