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

  • Операторы «++» и «-» устарели Xcode 7.3
  • Словарь в Swift с Mutable Array как значение работает очень медленно? Как оптимизировать или построить правильно?
  • @selector () в Swift?
  • Как создать случайное число в Swift без повторения предыдущего случайного числа?
  • Как создать экземпляры подclassов управляемого объекта в расширении NSManagedObject Swift?
  • почему я получаю «Должен переводить авторезистирующую маску в ограничения, чтобы иметь _setHostsLayoutEngine: YES» в xcode 6 beta
  • Аланофир-асинхронное завершениеHandler для запроса JSON
  • Как проверить равенство перечислений Swift со связанными значениями
  • Как определить, был ли затронут SKSpriteNode
  • Как использовать openURL для совершения телефонного звонка в Swift?
  • Обтекатель объектных объектов Swift в apple / swift
  • Давайте будем гением компьютера.