扩展数组以附加 SKTextures
Extending Array to append SKTextures
作为 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),所以我可以很容易地使用它。
您可以替换:
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)")
}
今天无法写这个扩展。您不能将扩展方法仅应用于某些类型的数组。
有两个很好的解决方案。您可以通过创建包含 [SKTexture]
的结构 (TextureList
) 来使用 HAS-A 模式,也可以使用函数。
作为 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),所以我可以很容易地使用它。
您可以替换:
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)")
}
今天无法写这个扩展。您不能将扩展方法仅应用于某些类型的数组。
有两个很好的解决方案。您可以通过创建包含 [SKTexture]
的结构 (TextureList
) 来使用 HAS-A 模式,也可以使用函数。