1

作为 Swift 的新手,我决定使用一个函数来扩展Array(或更具体地说[SKTexture]是 SKTexture 数组),以从应用程序包中添加指定数量的帧。

// FRAMES
FuzzyRabbit_0001@2x.png
FuzzyRabbit_0002@2x.png
FuzzyRabbit_0003@2x.png
FuzzyRabbit_0004@2x.png

// CALL
var rabbitTextures = [SKTexture]()
self.rabbitTextures.textureFromFrames("FuzzyRabbit", count: 4)

下面列出了我的第一次尝试,我Cannot invoke 'append' with an argument list of type '(SKTexture!)'从查看函数fuzzyPush中得到了错误,因为我试图附加一个SKTexture而不是通用的T.

这是可能的,还是我不希望函数是通用的,而是特定于SKTexture.

extension Array {

    // ONLY SKTexture
    mutating func textureFromFrames(imageName: String, count: Int) {
        if !(self[0] is SKTexture) { return }
        for index in 1...count {
            let image = String(format: "\(imageName)_%04d", index)
            let texture = SKTexture(imageNamed: image)
            self.append(texture) // ERROR: Cannot invoke append with an argument list of type SKTexture!
        }
    }

    // WORKS FINE
    mutating func fuzzyPush(newItem: T) {
        self.append(newItem)
    }
}

我只是好奇这是否是我可以通过扩展来做的事情,这不是问题,因为我将它作为一个接受 3 个参数(imageName、count、arrayToAppend)的函数,所以我可以很容易地使用它。

4

2 回答 2

2

今天不能写这个扩展。您不能仅将扩展方法应用于某些类型的数组。

有两个很好的解决方案。您可以通过创建TextureList包含 a 的 struct ( )来使用 HAS-A 模式[SKTexture],也可以使用函数。

于 2015-04-29T13:23:08.757 回答
1

您可以更换:

self.append(texture)

self.append(texture as T)

我在一个字符串数组上检查了这个并且它有效。关于第一个检查添加另一个检查以查看数组是否为空,否则self[0] is SKTexture将失败。

这是我在在线 swift 编译器上测试的代码(SKTexture显然不可用):

extension Array {

    mutating func textureFromFrames(imageName: String, count: Int) {
        for index in 1...count {
            let image = String(format: "\(imageName)_%04d", index)
            self.append(image as T) 
        }
    }
}


var arr = Array<String>()
arr.textureFromFrames("testing", count:4)

for tmp in arr {
    println("\(tmp)")
}
于 2015-04-29T13:20:05.007 回答