2015-04-28 2 views
2

Возможно ли при расширении до Array ограничить расширение только до определенного типа Array? То, что я пытаюсь сделать, это добавить расширение к Array, которое работает только с массивами типа [SKTexture].Ограничение расширения массива на определенный тип массива?

Я не хочу, чтобы расширение, чтобы сделать что-нибудь с массивами, содержащими другие типы (т.е. [Int], [Double], [String] и т.д.)

+2

Вы не можете, к сожалению. Я также желаю этой функциональности. Некоторые из лучших попыток существуют здесь: http://stackoverflow.com/questions/24047164/extension-of-constructed-generic-type-in-swift –

+0

Спасибо, Андрей, я посмотрю. – fuzzygoat

+0

Одинаковая проблема здесь: http://stackoverflow.com/questions/24938948/array-extension-to-remove-object-by-value (возможно дублировать?) Из голосовой ответ: * «Вы не можете написать метод на общий тип, более ограничивающий шаблон. "* –

ответ

0

Я согласен с комментариями выше, что это не возможно, чтобы написать расширение, как это, но хотелось предложить вместо этого использовать глобальную функцию, с возможностью каррирования для большей гибкости.

Для некоторых справочной информации см this blog post by Ole Begemann, где он отмечает, что в Swift,

метода экземпляра являются только выделанными функциями, которые принимают экземпляр в качестве первого аргумента.

Таким образом, с точки зрения Swift нет никакой разницы между instance.function() и .

Я не знаю, что вы пытаетесь сделать, но глобальная функция, которая выглядит следующим образом ...

func skTextureFunc(textures: [SKTexture])(arg: SomeArgType) { } 

..., для всех намерений и целей, точно так же, как метод экземпляра, который может быть привязан к конкретному экземпляру [SKTexture].

И если вы хотите, вы можете частично применить функцию к определенному экземпляру [SKTexture], который будет использоваться повторно, а затем использовать его, как если бы это был метод экземпляра, связанный с этим экземпляром. Так, например:

class Example { 
    var localSKTextureFunc: SomeArgType ->() { 
     return skTextureFunc(textureArray) 
    } 

    let textureArray = [SKTexture]() 
} 

Так во всем мире вы всегда можете использовать функцию выделанной и локально (внутри класса), вы можете связать выделанной функцию конкретного экземпляра класса.

Я знаю, что это не совсем то, что вы просили, но я думаю, что это лучшая работа для того, что мы не можем писать расширения, как тот, который вы описываете.

Смежные вопросы