Когда использовать предложение универсального параметра

Я новичок в дженериках в Swift, и, читая некоторые книги, я наткнулся на кое-что, чего не понимаю. В универсальных функциях, когда уместно использовать параметр типа (справа после имени функции)? а когда неуместно?

Вот пример, где он не используется (только подпись; из стандартной библиотеки):

func sorted(isOrderedBefore: (T, T) -> Bool) -> Array<T>

Вот пример того, где он используется (взято из книги, которую я читаю):

func emphasize<T>(inout array:[T], modification:(T) -> T) {
        for i in 0 ..< array.count {
            array[i] = modification(array[i])
        }
}

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


person Ramin Ahangarzadeh    schedule 20.12.2014    source источник


Ответы (1)


В первом примере общий параметр исходит из типа, в котором он определен. Я считаю, что он объявлен в массиве, который уже имеет общий тип T.

Во втором примере сама функция объявляет универсальный параметр. Если не ошибаюсь, эта функция глобальная. Это еще не входит в область, определяющую общий T.

Неуместно объявлять новый общий параметр в функции, которая скрывает или пытается заменить уже объявленный в своей области. Например, при расширении массива это было бы неуместно:

extension Array {
    func myFunc<T>() {
    }
}

Здесь мы определяем новый T, скрывающий исходный T, уже объявленный в объявлении Array.

Во всех других случаях, когда вам нужен универсальный тип, вы должны объявить его самостоятельно.

person drewag    schedule 20.12.2014
comment
Это имеет смысл. Очень признателен. - person Ramin Ahangarzadeh; 21.12.2014