Расширение массива для добавления 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)
    }
}

I was just curious if this is something I could do with an extension, its not a problem as I have this as a function that takes 3 parameters (imageName, count, arrayToAppend) so I can quite easily use that.

2 ответа

Решение

Это расширение не возможно написать сегодня. Вы не можете применить метод расширения только к определенным типам массивов.

Есть два хороших решения. Вы можете использовать шаблон HAS-A, создав структуру (TextureList) который содержит [SKTexture]или вы можете использовать функцию.

Вы можете заменить:

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)")
}
Другие вопросы по тегам