Swift中的泛型内嵌泛型

6

尝试理解下面的代码。 我知道在实例化 Optional 时 T 是被传递的,例如 Optional,但是 map 中的 U 类型呢?它假设了什么类型?

enum Optional<T> : LogicValue, Reflectable {
    case None
    case Some(T)
    init()
    init(_ some: T)

    /// Allow use in a Boolean context.
    func getLogicValue() -> Bool

    /// Haskell's fmap, which was mis-named
    func map<U>(f: (T) -> U) -> U?
    func getMirror() -> Mirror
} 
2个回答

6

类型U来自于map函数的参数f。如果你传递一个返回Int的闭包,那么map将返回一个Int?。如果你传递一个返回Array<Int>的闭包,那么map将返回一个Array<Int>?

例如,请尝试以下内容:

var opt1: Optional<Int> = .Some(1)
var opt2 = opt1.map { (i: Int) -> String in return "String: \(i)" }

你会发现opt1是一个Int?类型,而opt2是一个String?类型。

4

调用map函数时,调用者必须提供一个单一的参数,该参数是一个闭包,该闭包:

  1. 有一个参数,该参数与用于实例化Optional的类型相同,即T
  2. 具有某种类型的返回值。

U将成为所述返回值的类型。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接