2016-06-20 13 views
9

Ho appena trasferito il mio progetto da Swift 2.2 a Swift 3.0 con Xcode 8 beta.Errore del compilatore "Ambiguo uso del prefisso" con Swift 3

ho qualcosa simile al seguente codice (è possibile incollare questo in un parco giochi):

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 questo compilato bene. Tuttavia, con Swift 3.0 ottengo l'errore

uso ambiguo di 'prefisso'

L'unico modo per ottenere questo per compilare a Swift 3.0 è quello di dividere la carta in una riga separata:

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

let mappedDates = sortedDatesWithCount.map { 
    return $0.0 
} 

BTW, nel codice vero e sto tornando NSNotification oggetti dai non mapDate s, ma l'errore è lo stesso. Ho appena usato Date qui per rendere l'esempio semplice.

C'è un modo per farlo compilare come un unico rivestimento?

UPDATE: creato un JIRA per il progetto Swift.

risposta

11

Esso funziona se si fa l'ArraySlice in un array prima di passarlo al map:

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

Questo sembra un'inferenza di tipo bug nel compilatore.

+1

Data conforme al protocollo Paragonabile in Swift 3. 'ordinato {$ 0.0 <$ 1.0}' dovrebbe essere sufficiente –

+1

Grazie, non lo sapevo. Questa è una buona notizia! // Sto solo usando il codice di OP, e dicono che Date è solo un esempio comunque. :) – Moritz

+0

Sembra un bug di inferenza di tipo anche per me. Ho intenzione di segnalarlo come tale. @LeoDabus grazie per il suggerimento sull'ordinamento delle date. Il vero codice è in realtà l'ordinamento su Date anche. Il bit di esempio sta restituendo le date dalla mappa. – mluisbrown