2014-06-12 7 views
7

Chciałbym mieć ogólną funkcję, która może użyć operatora plus na dwóch wartościach.W Swift, jak ogólnie ograniczyć funkcję do typów, które rozumieją T + T

class funccalc { 
    func doAdd<T>(x:T,y:T) -> T { 
     return x + y 
    } 
} 
let a = funccalc() 
println(a.doAdd(1, y: 4)) 
println(a.doAdd(23.54, y:200)) 

pojawia się błąd na return x + y

Czy moja jedyna opcja stosować się do sugestii w tej odpowiedzi: https://stackoverflow.com/a/24047239/67566 i utworzyć mój własny protokół jako Int i String byłoby zdefiniowanie operatora?

Odpowiedz

5

Powinieneś zrobić tak, jak sugeruje ta odpowiedź. Utwórz protokół do użytku i rozszerz wszystkie klasy, które chcesz z niego korzystać. Następnie upewnij się, że T implementuje ten protokół w swoim metodzie podpisu.

Nie można użyć protokołu "do dodania", ponieważ nie ma go w trybie szybkim. Szybka biblioteka faktycznie tworzy funkcję + dla każdej ważnej operacji dodawania. Kliknij Command, kliknij coś podobnego do Int, aby zobaczyć, gdzie wszystkie są zdefiniowane. Będzie to wyglądać mniej więcej tak:

//.... 
func +(lhs: Int8, rhs: Int8) -> Int8 
func +(lhs: UInt16, rhs: UInt16) -> UInt16 
func +(lhs: Int16, rhs: Int16) -> Int16 
func +(lhs: UInt32, rhs: UInt32) -> UInt32 
func +(lhs: Int32, rhs: Int32) -> Int32 
//etc... 
+3

Miałem nadzieję, że będzie inny sposób, ponieważ tworzenie nowego protokołu tylko po to, aby uzyskać tego typu funkcjonalność, wydaje się nieco denerwujące. Operacja command-clck jest dla mnie nowa, będę musiał spróbować. –

10

mogą mieć podobną potrzebę innych funkcji też i wdrażanie ich dla wszystkich liczb całkowitych i zmiennoprzecinkowych typów punkt (lub inne „rzeczy” summable) spowodowałoby ogromne powielania kodu.

Jeden częściowe rozwiązanie, szczególnie dla +, -, *, /,% jest wymaganie zgodności do IntegerArithmeticType protokół:

func example<T: IntegerArithmeticType>(x: T, y: T) -> T { return x + y } 
println(example(40, 2)) // --> 42 

tego nie stosuje się do pływających typy punktów, ponieważ nie realizuje działania przepełnienia zdefiniowane w protokole _IntegerArithmeticType, z którego dziedziczy IntegerArithmeticType.

Jednak rozszerzenie rodzajów zadaniu zdefiniowane globalnie funkcji operator zgodności nie jest tak „irytujące”, jak myślisz:

protocol Summable { func +(lhs: Self, rhs: Self) -> Self } 

extension Int: Summable {} 
extension Double: Summable {} 
extension String: Summable {} 
// extension for any other types... you are in full control! 

to zrobić raz, a potem na zawsze można użyć Summable w was kodu:

Rzeczywiście, jak podkreślił @connor, jest to odpowiednik wspomnianej przez pana Jeana-PhilippePelleta odpowiedzi.

Powiązane problemy