2014-12-12 7 views
5

Optional<T> ma metodę map.Jak mogę wywołać .map() na ImplicitlyUnwrappedOptional?

/// If `self == nil`, returns `nil`. Otherwise, returns `f(self!)`. 
func map<U>(f: (T) -> U) -> U? 

Gdy chcemy konwertować Int? do UInt64?, możemy:

let iVal:Int? = 42 
let i64Val = iVal.map { UInt64($0) } 

Zamiast:

var i64Val:UInt64? 
if let iVal = iVal { 
    i64Val = UInt64(iVal) 
} 

Tutaj, ImplicitlyUnwrappedOptional<T> ma tę samą metodę:

/// If `self == nil`, returns `nil`. Otherwise, returns `f(self!)`. 
func map<U>(f: (T) -> U) -> U! 

... Więc próbowałem i nie udało :(

let iVal:Int! = 42 
let i64Val = iVal.map { UInt64($0) } 
//   ^ ~~~ [!] error: 'Int' does not have a member named 'map' 

Oto pytanie: Jak można wywołać tej metody?

+1

myślę posiadające funkcję map' 'na' 'ImplicitlyUnwrappedOptional jest bezcelowe. Kompilator już konwertuje go na wartość. – mustafa

Odpowiedz

4
let i64Val = (iVal as ImplicitlyUnwrappedOptional).map {UInt64($0)} 
+0

Dzięki! ale ... myślę, że tego nie wykorzystam: / – rintaro

2
let iVal:Int! = 42 
let i64Val = (iVal as Int?).map { UInt64($0) } 
+0

Nieźle :) Ale to faktycznie wywołuje 'Opcjonalnie .map', a nie' ImplicitlyUnwrappedOptional'. Chociaż, jak sądzę, twoja odpowiedź jest najbardziej przydatna w ** przypadkach praktycznego użycia **. – rintaro

+0

prawda, ale biorąc pod uwagę domyślnie nieopakowane opcje są miny lądowe, robiąc wszystko, aby je zachować, wydaje się wątpliwe :-) –

+2

'let i64Val = map (iVal) {UInt64 ($ 0)}' również dostaje wyraźną wersję opcjonalną i jest prawdopodobnie trochę bardziej czytelny. –

1

Myślę, że komunikat o błędzie czyści go: error: 'Int' does not have a member named 'map'. Mówi ona, że ​​wartośćnie jest już rozpakowana podczas próby wywołania metody.

Więc po prostu użyć:

let iVal:Int! = 42 
let i64Val = UInt64(iVal) 
Powiązane problemy