2014-08-28 15 views
15
func myfunc<T>(i:T) -> T { 
    return i 
} 

Czy można zamknąć tę funkcję?Czy można utworzyć ogólne zamknięcie w Swift?

let myfunc = { <T>(i:T) -> T in 
    return i 
} 

to nie działa ...

+1

Podobne (takie same?) Pytanie tutaj: http://stackoverflow.com/questions/25401584/generics-as-parameters-to-a-closure-in-swift. –

+1

Generics nie może być używany z zamknięciami. Odpowiedź powiązana z @MartinR zapewnia obejście. Nie sądzę, aby to pytanie było duplikatem, ponieważ inne pytanie dotyczy zamknięcia z użyciem generyków, podczas gdy jest to jednoznaczne pytanie, czy można stosować generyczne. – Antonio

+0

Wierzę, że odpowiedź brzmi, że to nie działa, ponieważ nie ma sensu (nie ma to nic wspólnego z Swift w szczególności). 'myfunc' będzie typu abstrakcyjnego, który jest taki sam jak próba skonstruowania klasy abstrakcyjnej. Omówię więcej w odpowiedzi na pytanie @MartinR links. –

Odpowiedz

8

Nie, ponieważ zmienne i wyrażenia nie może być rodzajowy. Są tylko ogólne funkcje i typy ogólne.


Dla wyjaśnienia: W niektórych językach można mieć typy z kwantyfikatorem ogólnym, jak forall a. a -> a. Ale w Swift typy nie mogą mieć uniwersalnego kwantyfikatora. Tak więc wyrażenia i wartości nie mogą same być ogólne. Deklaracje funkcji i deklaracje typów mogą być ogólne, ale kiedy używa się takiej ogólnej funkcji lub instancji takiego typu ogólnego, jako typ argumentu wybiera się jakiś typ (który mógłby być typem rzeczywistym lub zmienną typu), a następnie wartość, którą otrzymujesz, nie jest już sama generyczna.

+0

Masz rację, dziękuję i dziękuję Rob Napier. –

+1

Zgadzam się z Robem w tym sensie, że powinno się używać 'typealias' w połączeniu z zamknięciem, aby zdefiniować typ ogólny zamknięcia – Mazyod

+0

W większości języków programowania argumenty funkcji ogólnych są efektywnie tylko argumentami funkcji z wartościami zapakowanymi podczas kompilacji -czas. Oznaczałoby to, że możliwe wartości ogólnego argumentu są obliczane podczas kompilacji, a nie tylko używane w czasie wykonywania (jak normalne argumenty funkcji/zamknięcia). Zaletą jest możliwość sparametryzowania zamknięcia za pomocą typów, które wymagają oceny podczas kompilacji, np. 'StringLiteralConvertible'. Myślę, że twoje zamieszanie polega na myśleniu o zmiennej lub ekspresji jako ogólnej; raczej jest to zamknięcie, które jest ogólne. –

Powiązane problemy