gpt4 book ai didi

swift - 展开我之前设置的纹理值时发现 nil

转载 作者:行者123 更新时间:2023-11-28 10:37:33 24 4
gpt4 key购买 nike

所以我试图将一个 SKSprite 节点添加到我的场景 level2,我想给它一个物理体,其纹理来 self 上传到项目 Assets 文件夹中的图像。图像在那里并且名称是正确的,但是当启动应用程序时我得到一个 fatal error 。在我添加最后一行代码之前,我不知道哪里出错了,因为该应用程序过去一直运行平稳。

import UIKit
import SpriteKit
import GameplayKit

class level2: SKScene {

var entities = [GKEntity]()
var graphs = [String : GKGraph]()

var perno = SKSpriteNode(fileNamed: "perno")

override func sceneDidLoad () {
print ("view2 Loaded")

self.perno = self.childNode(withName: "perno") as? SKSpriteNode
self.perno?.texture = SKTexture(imageNamed: "perno")
self.perno?.size.width = self.perno!.size.width * 5

self.perno!.physicsBody = SKPhysicsBody(texture: (perno?.texture)!, size: (perno?.texture?.size())!)



}

有什么提示吗?

谢谢!

最佳答案

您的可选处理确实不一致。有时您使用可选转换和可选链接只是为了然后在同一行中对同一变量使用强制展开。你应该强制解包 SKSpriteNode(fileNamed: "perno") 的返回值,因为如果返回 nil 那是程序员错误,应该尽快被捕获。

您的直接问题似乎是您试图覆盖 sceneDidLoad 中的 perno:

self.perno  = self.childNode(withName: "perno") as? SKSpriteNode

没有 childNode 添加到您的场景中,因此您只需将 perno 设置为 nil 而不是之前使用 var 设置的值perno = SKSpriteNode(fileNamed: "perno").只需从 sceneDidLoad 中删除该行,因为它没有意义,perno 在初始化期间已经加载,因为您为其分配了一个值。

class Level2: SKScene {

var entities = [GKEntity]()
var graphs = [String : GKGraph]()

let perno = SKSpriteNode(fileNamed: "perno")!

override func sceneDidLoad () {
print ("view2 Loaded")
self.perno.texture = SKTexture(imageNamed: "perno")
self.perno.size.width = self.perno.size.width * 5

self.perno.physicsBody = SKPhysicsBody(texture: perno.texture!, size: perno.texture!.size())
}

}

更好的保护自己的方法是使用guard 语句。 guard 允许您安全地检查变量是否不为 nil,而无需嵌套您的代码。

class Level2: SKScene {

var entities = [GKEntity]()
var graphs = [String : GKGraph]()

let perno = SKSpriteNode(fileNamed: "perno")!

override func sceneDidLoad () {
print ("view2 Loaded")
guard let texture = SKTexture(imageNamed: "perno")
else{
fatalError("Unable to find texture "perno")
}
self.perno.texture = texture
self.perno.size.width = self.perno.size.width * 5

self.perno.physicsBody = SKPhysicsBody(texture: texture, size: texture.size())
}

}

如您所见,我们并没有过度展开 self.perno.texture,这意味着我们不小心使用 ?而不是 !,而且我们有一个明确的错误,说明为什么我们的代码会崩溃。

关于swift - 展开我之前设置的纹理值时发现 nil,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52607121/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com