Общий внутри общего в Swift

#swift

#swift

Вопрос:

Пытаюсь разобраться в приведенном ниже коде. Я понимаю, что T передается при создании экземпляра необязательного, как в необязательном, но как насчет типа U в map. Какой тип это предполагает?

 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
} 
 

Ответ №1:

Тип U передается из f параметра в map функцию. Итак, если вы передаете замыкание, которое возвращает a Int , затем map возвращает a Int? . Если вы передаете замыкание, которое возвращает a Array<Int> , то map возвращает a Array<Int>? .

Например, попробуйте это:

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

Вы обнаружите, что opt1 это Int? и opt2 есть String? .

Ответ №2:

При вызове map функции вызывающий должен предоставить один аргумент, который является замыканием, которое:

  1. Имеет один аргумент того же типа, что и аргумент, используемый для создания экземпляра Optional , т.е. T
  2. Имеет возвращаемое значение некоторого типа.

U тогда будет тип указанного возвращаемого значения.