Swift中泛型中的泛型

时间:2014-06-24 19:57:15

标签: swift

尝试理解下面的代码。 我知道在实例化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 个答案:

答案 0 :(得分:6)

U类型来自f函数的map参数。因此,如果您传递一个返回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)" }

您会发现opt1Int?opt2String?

答案 1 :(得分:4)

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

  1. 有一个参数类型与以前的类型相同 实例化Optional,即T
  2. 具有某种类型的返回值。
  3. U将是所述返回值的类型。