2014-06-24 25 views
6

Próba zrozumienia kodu poniżej. Rozumiem, że T jest przekazywane podczas tworzenia Opcji, tak jak w Opcjonalnym, ale co z typem U na mapie. Jakiego rodzaju to zakłada?Generic within a Generic w Swift

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 
} 

Odpowiedz

6

Typ U pochodzi od parametru do funkcji mapf. Tak więc jeśli zdasz zamknięcie, które zwróci wartość Int, wówczas map zwróci wartość Int?. Jeśli przekażesz zamknięcie, które zwróci wartość Array<Int>, wówczas map zwróci wartość Array<Int>?.

Na przykład, spróbuj tego:

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

przekonasz się, że opt1 jest Int? i opt2 jest String?.

4

Po wywołaniu funkcji map rozmówca musi podać jeden argument, który jest zamknięcie że:

  1. ma jeden argument, który jest tego samego typu jak ta stosowana do instancję Optional, tj T
  2. Ma wartość zwracaną pewnego typu.

U będzie wówczas typem wspomnianej wartości zwracanej.