#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
функции вызывающий должен предоставить один аргумент, который является замыканием, которое:
- Имеет один аргумент того же типа, что и аргумент, используемый для создания экземпляра
Optional
, т.е.T
- Имеет возвращаемое значение некоторого типа.
U
тогда будет тип указанного возвращаемого значения.