2015-11-19 5 views

Antwort

7

Aus Gründen der Vollständigkeit, Optional hat eine map() Methode:

/// If `self == nil`, returns `nil`. Otherwise, returns `f(self!)`. 
@warn_unused_result 
@rethrows public func map<U>(@noescape f: (Wrapped) throws -> U) rethrows -> U? 

Deshalb

index != nil ? index! + 1 : nil 

entspricht

index.map { $0 + 1 } 
+0

Ich mag, dass das Inkrement mit der '+ 1' sichtbarer ist und dass es mit jeder anderen Zahl funktionieren würde :) –

6

können Sie rufen die successor Eigenschaft mit optional Verkettungs:

return index?.successor() 

Für einen beliebigen Wert, advancedBy Werke:

return index?.advancedBy(15) 

Wenn Sie selbst tun dies viele Male fand in Ihr Code, Sie könnten Ihren eigenen + Operator definieren, der einehinzufügtauf ein Int?:

func +(i: Int?, j: Int) -> Int? { 
    return i == nil ? i : i! + j 
} 

Dann könnten Sie gerade tun:

return index + 1 
+0

Schöne Ergänzung zu Ihrer Antwort! –

+0

Danke! Ich habe noch einen weiteren hinzugefügt. – vacawama

0

Sie optional mit einem Fragezeichen ein beliebiges Verfahren auf einer optionalen durch das Voranstellen des Anrufs nennen kann, und das funktioniert für Postfix-Operatoren zu:

return index?++ 

Allgemeiner können Sie auch schreiben:

index? += 1; return index 
+1

Wie in einer gelöschten Frage gesagt, hat dies den Nachteil, nicht zu funktionieren, wenn Index eine Konstante ist (lassen) –

+0

'Rendite-Index? + = 1' funktioniert nicht. Es gibt Kompilierungsfehler 'Fehler: kann Rückgabeausdruck von Typ '() nicht konvertieren?' Geben Sie 'Int?' zurück – vacawama

+0

Sie haben Recht. Ich habe mein Code-Snippet bearbeitet, um das Problem zu beheben. Wie auch immer, es erfüllt immer noch nicht die Anforderung, mit Let zu arbeiten und es gibt bereits eine gute Antwort mit map. –

Verwandte Themen