2015-04-29 17 views
20

Ho un intervallo su cui sto cercando di mappare, ma sto ricevendo l'erroreErrore del compilatore Swift: "Impossibile richiamare 'mappa' con un elenco di argomenti di tipo '((_) -> _)'"

“Cannot invoke 'map' with an argument list of type '((_) -> _)'”

Ecco ciò che il codice è simile

let patterns = (0...5).map { verseNum in 
     let verseNumberStartPattern = "\"verse-num\">\(verseNum)</span>(?:\\s?<span>)?(.*?)<" 
     let chapterStartPattern = "\"chapter-num\">\\s\(parsedVerse.chapterStart)\\s</span>" 
     if verseNum == 1 { 
      return chapterStartPattern + "(.*?)<" 
     } else { 
      return chapterStartPattern + "(?:.*?)" + verseNumberStartPattern 
     } 
    } 

Se prendo tutto all'interno della chiusura e appena ritorno "", quindi il compilatore non si lamenta. Tuttavia, anche se aggiungo una linea diversa da quella di ritorno stringa vuota, allora il compilatore si lamenta, come ad esempio per:

let patterns = (0...5).map { verseNum in 
     let verseNumberStartPattern = "\"verse-num\">\(verseNum)</span>(?:\\s?<span>)?(.*?)<" 
     return "" 
    } 

mi manca qualcosa qui?

risposta

38

Swift non può dedurre tipi dal contesto ogni volta. Se non è possibile dedurre i tipi, si deve digitare esplicitamente, in questo caso il tipo di ritorno:

let patterns = (0...5).map { verseNum -> String in 

In questo caso credo Swift dovrebbe essere in grado di dedurre il tipo quindi potrebbe essere un bug.

+0

che era, grazie !! – tkuichooseyou

+0

Vorrei aggiungere che questo è veramente un bug nell'inferenza di tipo di Swift, piuttosto che un modo in cui deve essere _has_. 'verseNum' dovrebbe essere deducibile dall'intervallo e il valore restituito dalle dichiarazioni di ritorno. –

+0

Inoltre, se si dispone di una sottoclasse, sarà necessario utilizzare il nome del tipo di classe base, quindi chiedere nuovamente l'oggetto "as!" la tua sottoclasse. –

Problemi correlati