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