generics как параметры для закрытия в быстрых

У меня возникли проблемы с написанием следующей функции в виде замыкания

func myfunc(param: S) { ... } 

Я пытался

 let myClosure = {(param: S) in ... } 

но это не сработает.

Какие-либо предложения?

Я считаю, что то, о чем вы просите, не имеет смысла (не имеет никакого отношения к Swift). Хотя я заинтересован в том, чтобы оказаться ошибочным, я не считаю, что это можно было бы разумно создать на любом строго типизированном языке. (EDIT: продолжая мои исследования, я считаю, что это было бы возможно на языке с первоclassным polymorphismом, но я не знаю каких-либо общедоступных языков, которые действительно имеют эту функцию.)

 let myClosure = {(param: S) in ... } 

Какой тип вы ожидаете от myClosure ? Общий тип создает абстрактный тип. Он не становится настоящим типом, пока он не станет специализированным. Таким образом, myClosure будет иметь абстрактный тип. Это похоже на запрос экземпляра абстрактного classа. Весь смысл «абстрактного» заключается в том, что вы не можете его построить. Лучшее, что вы могли бы сказать, было бы в том, что myClosure сам по себе будет типом, который вам нужно будет создать в реальном экземпляре (но тогда let не имеет никакого смысла, вы не let типы).

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

Теперь то, что будет иметь смысл ИМО (но в настоящее время кажется невозможным), заключается в следующем:

 typealias Mapping = S -> S let identity: Mapping = { return $0 } 

Это имеет смысл, потому что вы определяете абстрактный тип ( Mapping ), но затем создаете конкретный тип Mapping . К сожалению, typealias не поддерживает поддержку дженериков на данный момент, поэтому struct , вероятно, является лучшим инструментом, который у нас есть.


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

 func Identity(i:T) -> T { return i } let identityInt:(Int -> Int) = Identity identityInt(1) // => 1 

Используя это, чтобы изучить проблему абстрактных типов немного больше, рассмотрим:

 func Identity(i:T) -> T { return i } let x = Identity 

Это не скомпилируется с ошибкой:

 error: cannot convert the expression's type '(T) -> T' to type '(T) -> T' 

Это потому, что тип (T) -> T не является конкретным типом, поэтому вы не можете иметь один, который называется x . Сравните это с identityInt , который я явно специализировал в конкретном типе, а затем мог бы построить.

Вы можете попробовать закрыть ваше закрытие внутри структуры, объявляющей общий тип. Что-то вроде:

 struct ClosureWrapper { let myClosure = {(param: S) in ... } } 

Конечно, в этот момент ваше закрытие также может быть нормальной функцией: P

  • развертывание нескольких опций в выражении if
  • Как переместить врага в сторону движущегося игрока?
  • Как использовать метод экземпляра как обратный вызов для функции, которая принимает только func или буквальное закрытие
  • Внедрение алгоритма сортировки Swift
  • Как преобразовать шестнадцатеричный номер в корзину в Swift?
  • Как проверить, содержит ли строка строку Swift?
  • Как отправить запрос POST и GET?
  • Быстрая сумма
  • перебирать атрибуты classа объектов в Swift
  • В чем смысл метки «#» на быстром языке?
  • Интроспекция и дженерики Swift
  • Interesting Posts

    c ++ exception: throwing std :: string

    Что такое предупреждающий вывод «Игнорирование InnerClasses» во время компиляции?

    Конструктор перегрузки для classов Case Scala?

    Как кэшировать InputStream для многократного использования

    Ошибка при загрузке действительного документа Windows-1252 «Системная ошибка: -2146697210»

    NETWORK_PROVIDER не предоставляет обновленные местоположения

    Как устранить проблемы, возникающие во время загрузки?

    Как вы используете больше смайликов в Office Communicator?

    Является ли sizeof (некоторый указатель) всегда равным четырем?

    Как добавить к моему андроидному приложению кнопку, чем нравится на странице facebook?

    Учитывая целое число, как я могу найти следующую большую мощность из двух, используя бит-twiddling?

    Различия между INDEX, PRIMARY, UNIQUE, FULLTEXT в MySQL?

    Моделирование сетевого соединения с низкой пропускной способностью и высокой задержкой в ​​Linux

    Программно добавить один вид ниже другого в относительной компоновке

    Восстановление поврежденного Pen Drive

    Давайте будем гением компьютера.