你如何在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") }
最后一件事。 我用
Image1
和Image2
replace了Image1.png
和Image2.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)) } }