Swift中的泛型类型

时间:2014-11-23 01:26:49

标签: swift generics

在haskell中你可以这样做:

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

我试图在Swift中做类似的事情。到目前为止,我写这些代码没有运气。

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

这在swift中根本不可能吗?如果有其他方法来实现这种行为?

更新:现在swift 3中似乎支持泛型类型 https://github.com/apple/swift/blob/master/CHANGELOG.md

4 个答案:

答案 0 :(得分:38)

从Swift 3.0开始,可以使用Generic typealias。这应该适合你:

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

以下是完整文档:https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Declarations.html#//apple_ref/swift/grammar/typealias-declaration

用法(来自@Calin Drule评论):

func parse<A>(stringToParse: String, parser: Parser) 

答案 1 :(得分:35)

typealias目前无法与泛型一起使用。您最好的选择可能是将解析器函数包装在结构中。

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

然后,您可以在创建解析器时使用尾随闭包语法,例如

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

答案 2 :(得分:0)

这里我将介绍 typealias 的示例,该示例将您展示如何在协议定义中使用 typealias :我希望这有助于您了解typealias

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
 }
}

输出:

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

答案 3 :(得分:0)

通用类型别名-SE-0048

状态:已实施(快速3)

  

解决方案很简单:允许类型别名引入类型参数,这些参数在其定义范围内。这样一来,人们可以表达以下内容:

typealias StringDictionary<T> = Dictionary<String, T>
typealias IntFunction<T> = (T) -> Int
typealias MatchingTriple<T> = (T, T, T)
alias BackwardTriple<T1, T2, T3> = (T3, T2, T1)