在Swift 3中获取SKSpriteNode的文件名

时间:2016-12-21 21:42:30

标签: swift sprite-kit swift3 skspritenode

如何从SKSpriteNode访问图像文件名?我一直试图谷歌这个,但似乎没有答案可用。这是我的代码中无用的部分:

current_ingredient?.name = String(describing: current_ingredient?.texture)

print("Filename: \(current_ingredient?.name)")

print命令返回:

Filename: Optional("Optional(<SKTexture> \'ingredient14\' (110 x 148))")

所以,问题是,我如何只得到&#34; ingredient14&#34;?

3 个答案:

答案 0 :(得分:7)

保存在userData

您可以将用于创建精灵的图像名称存储在userData属性中。

let imageName = "Mario Bros"
let texture = SKTexture(imageNamed: imageName)
let sprite = SKSpriteNode(texture: texture)
sprite.userData = ["imageName" : imageName]

现在给定一个精灵,您可以检索最初使用的图像的名称

if let imageName = sprite.userData?["imageName"] as? String {
    print(imageName) // "Mario Bros"
}

答案 1 :(得分:4)

它存储在描述中,所以这里有一个很好的小扩展,我把它撕掉了。

extension SKTexture
{
    var name : String
    {
        return self.description.slice(start: "'",to: "'")!
    }
}

extension String {
    func slice(start: String, to: String) -> String? 
    {

        return (range(of: start)?.upperBound).flatMap 
        { 
          sInd in
            (range(of: to, range: sInd..<endIndex)?.lowerBound).map 
            {
                eInd in
                substring(with:sInd..<eInd)

            }
        }
    }
}
usage:

print(sprite.texture!.name)

答案 2 :(得分:3)

您可以使用以下扩展名

从纹理描述中提取文件名
case class Cons[A: Numeric](h:A, t:List[A]) extends List[A] {
  def sum: A = List.sum(this)
}

object List {
  def sum[A](ints:List[A])(implicit ev: Numeric[A]):A = ints match {
    case Nil => ev.zero
    case Cons(x,xs) => ev.plus(x, sum(xs))
  }
}
val x = Cons(4, Cons(2, Nil))
x.sum  // res0: Int = 6

用法:

extension SKTexture {
    var name:String? {
        let comps = description.components(separatedBy: "'")
        return comps.count > 1 ? comps[1] : nil
    }
}