2014-11-23 14 views
43

in Haskell Sie dies tun können:Generisches typealias in Swift

type Parser a = String -> [(a, String)] 

Ich habe versucht, etwas Ähnliches in Swift zu machen. Bisher habe ich diese Codes ohne Glück geschrieben.

typealias Parser<A> = String -> [(A, String)] 
typealias Parser a = String -> [(a, String)] 
typealias Parser = String -> [(A, String)] 

So ist das einfach unmöglich in swift? Und wenn ja, gibt es noch eine andere Möglichkeit, dieses Verhalten zu implementieren?

UPDATE: Es generic typealiases scheint nun in schnellen 3 https://github.com/apple/swift/blob/master/CHANGELOG.md

Antwort

35

typealias kann mit Generika derzeit nicht verwendet werden, unterstützt werden. Ihre beste Option könnte darin bestehen, die Parser-Funktion in eine Struktur zu integrieren.

struct Parser<A> { 
    let f: String -> [(A, String)] 
} 

Sie können dann die abschließende Closure-Syntax verwenden, wenn Sie einen Parser erstellen, z.

let parser = Parser<Character> { string in return [head(string), tail(string)] } 
+0

Oh. Boxen. Es funktioniert immer. Vielen Dank. – mustafa

+0

@mustafa Hallo, könnten Sie mir bitte sagen, welcher Teil davon Boxen bedeutet? Du meintest nicht Boxen im Java-Sinne, oder? Außerdem habe ich ein Problem damit meinen Kopf um '[head (string) ...' und 'tail (string)]' zu legen. Vielen Dank. – Unheilig

+1

@Unheilig Boxing bezieht sich auf das Umhüllen eines Typs um einen anderen, um die Fähigkeiten zu nutzen, die nur im äußeren Typ gefunden werden. Sie kennen vielleicht das Konzept von Objective-C, bei dem Grundelemente wie Ganzzahlen nicht in ein NSArray übergeben werden können, ohne in einer NSNummer "eingerahmt" zu sein, z. B. "@ (1234)". Das Kopf/Schwanz-Ding ist nicht schnell spezifisch, sondern eher ein übliches Muster zum Aufteilen eines Arrays in den ersten Gegenstand (den Kopf) und die verbleibenden Gegenstände (den Schwanz). Siehe http://chris.eidhof.nl/posts/swift-tricks.html – clozach

0

Hier präsentiere ich Beispiel für typealias, die Sie demonistrate, wie typealias in Protokolle Definitionen zu verwenden: Ich hoffe, das Sie typealias verstehen hilft

protocol NumaricType { 
typealias elementType 
func plus(lhs : elementType, _ rhs : elementType) -> elementType 
func minus(lhs : elementType, _ rhs : elementType) -> elementType 
} 


struct Arthamatic :NumaricType { 

func addMethod(element1 :Int, element2 :Int) -> Int { 
    return plus(element1, element2) 
} 
func minusMethod(ele1 :Int, ele2 :Int) -> Int { 
    return minus(ele1, ele2) 
} 

typealias elementType = Int 

func plus(lhs: elementType, _ rhs: elementType) -> elementType { 
    return lhs + rhs 
} 
func minus(lhs: elementType, _ rhs: elementType) -> elementType { 
    return lhs - rhs 
} 
} 

Ausgang:

 let obj = Arthamatic().addMethod(34, element2: 45) // 79 
+0

Hey @Narendra G Machst du diese Lösung könnte auch für andere numerische Typen funktionieren? – eonist

Verwandte Themen