Разширяване на масив за добавяне на SKTextures

Тъй като съм сравнително нов в Swift, реших да разгледам разширяването на Array (или по-конкретно [SKTexture] масиви от SKTexture) с функция за добавяне на определен брой кадри от пакета приложения.

// FRAMES
[email protected]
[email protected]
[email protected]
[email protected]

// 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), така че мога доста лесно да го използвам.


person fuzzygoat    schedule 29.04.2015    source източник
comment
Сравнете stackoverflow.com/questions/29929497/ и препратките в коментарите. Не можете да напишете метод за разширение само за определен тип масив.   -  person Martin R    schedule 29.04.2015


Отговори (2)


Това разширение не е възможно да се напише днес. Не можете да приложите метод на разширение само към определени типове масиви.

Има две добри решения. Можете да използвате модел HAS-A, като създадете структура (TextureList), която съдържа [SKTexture], или можете да използвате функция.

person Rob Napier    schedule 29.04.2015
comment
Така че е дубликат на stackoverflow.com/questions/27350941/? - person Martin R; 29.04.2015
comment
Съгласен. Това е дубликат. - person Rob Napier; 29.04.2015
comment
И познайте кой отговори на това :) - person Martin R; 29.04.2015
comment
Роб, благодаря ти за отговора и за показалеца към дубликата. Много ценя сър. - person fuzzygoat; 29.04.2015

Можете да замените:

self.append(texture)

с

self.append(texture as T)

Все пак проверих това на масив от низове и проработи. За първата проверка добавете друга проверка, за да видите дали масивът е празен, в противен случай self[0] is SKTexture ще се провали.

Това е кодът, който тествах на онлайн бърз компилатор (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)")
}
person giorashc    schedule 29.04.2015