你如何在Swift中获得一个精灵/纹理的原始文件名?

我创build一个精灵并为其分配一个图像文件。

var logoImage = SKSpriteNode(imageNamed: "image1.png") 

那么在某些情况下,我改变了图像。

 logoImage.texture = SKTexture(imageNamed: "image2.png") 

在应用程序的另一部分,我想检查当前正在显示哪个图像。 但是我不知道如何获取文件名。

使用:

 print(logoImage.texture?.description) 

返回:

 "<SKTexture> 'image2.png' (500 x 500)" 

其中显然包含的文件名,但我怎么得到它自己的文件名?

我build议你避免暴露你的对象的内部逻辑。

而且绝对不应该在当前使用的纹理上构build游戏逻辑。 演示文稿应该仅仅是实际数据的表示。

所以你应该创build自己的包装逻辑和数据的类,就像这样。

 class Logo: SKSpriteNode { enum Type: String { case A = "Image1", B = "Image2" var imageName: String { return self.rawValue } } private var type: Type { didSet { self.texture = SKTexture(imageNamed: type.imageName) } } init(type: Type) { self.type = type let texture = SKTexture(imageNamed: type.imageName) super.init(texture: texture, color: .clearColor(), size: texture.size()) } required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } } 

用法

现在您可以轻松创build一个徽标

 let logo = Logo(type: .A) 

您可以更改该精灵的纹理

 logo.type = .B 

你可以检查当前使用的纹理

 switch logo.type { case .A: print("It's using Image1") case .B: print("it's using Image2") } 

最后一件事。 我用Image1Image2replace了Image1.pngImage2.png 。 如果您正在使用资产目录(您应该),那么您不需要指定文件扩展名。

你可以使用:

 if logoImage.texture?.descriptio.containsString("image1.png") { // your code for image1 here } else { // your code for image2 here } 

你将有使用:

 import Foundation 

在您的代码为containsString

我敢肯定,有一个更优雅的方法,但它的工作原理:

 if let rangeOfIndex = texture.description.rangeOfCharacterFromSet(NSCharacterSet(charactersInString: "'"), options: .BackwardsSearch) { let filename = texture.description.substringToIndex(rangeOfIndex.endIndex) if let r = filename.rangeOfCharacterFromSet(NSCharacterSet(charactersInString: "'"), options: .LiteralSearch) { print(filename.substringFromIndex(r.startIndex).stringByReplacingOccurrencesOfString("'", withString: "", options: NSStringCompareOptions.LiteralSearch, range: nil)) } }