2016-06-20 7 views
9

Ich habe gerade mein Projekt von Swift 2.2 auf Swift 3.0 mit Xcode 8 Beta migriert."Mehrdeutige Verwendung von Präfix" Compilerfehler mit Swift 3

Ich habe etwas ähnliches wie den folgenden Code (Sie dies in einen Spielplatz einfügen können):

import Foundation 

let datesWithCount: [(Date, Int)] = [(Date(), 1), (Date(), 2), (Date(), 3)] 

let dates: [Date] = datesWithCount.sorted { 
    $0.0 < $1.0 
}.prefix(1).map { 
    return $0.0 
} 

In Swift 2.2 dieses feinen zusammengestellt. Doch mit Swift 3.0 Ich erhalte die Fehler

mehrdeutige Verwendung von ‚prefix‘

Der einzige Weg, dies in Swift 3.0 zu kompilieren zu bekommen, ist die Karte in eine separate Zeile aufzuschlüsseln:

let sortedDatesWithCount = datesWithCount.sorted { 
    $0.0 < $1.0 
}.prefix(1) 

let mappedDates = sortedDatesWithCount.map { 
    return $0.0 
} 

BTW, in dem eigentlichen Code, den ich Rückkehr NSNotification Objekte aus dem map nicht Date s aber der Fehler ist das gleiche. Ich habe gerade Date hier verwendet, um das Beispiel einfach zu machen.

Gibt es eine Möglichkeit, dies als einen einzigen Liner zu kompilieren?

UPDATE: Erstellt eine JIRA für das Swift-Projekt.

Antwort

11

Es funktioniert, wenn Sie die ArraySlice in ein Array machen, bevor es zu map vorbei:

let dates: [Date] = Array(datesWithCount.sorted { 
    $0.0 < $1.0 
}.prefix(1)).map { return $0.0 } 

Diese sehen aus wie einen Typinferenz Fehler in dem Compiler.

+1

Datum entspricht dem Protokoll Vergleichbar in Swift 3. 'sortierte {$ 0.0 <$ 1.0}' sollte genug sein –

+1

Danke, ich wusste es nicht. Das sind sehr gute Nachrichten! // Ich benutze nur den OP-Code, und sie sagen, dass Date nur ein Beispiel ist. :) – Moritz

+0

Sieht für mich auch wie ein Inferenzfehler aus. Ich werde es als solches melden. @LeoDabus danke für den Tipp zum Sortieren von Daten. Der echte Code sortiert tatsächlich auch nach Daten. Das Beispielbit gibt Daten aus der Karte zurück. – mluisbrown