2014-11-04 14 views
16

Tutto quello che devi fare è avviare un nuovo progetto in Swift e aggiungere al main.swiftparametro inout in chiusura si blocca il compilatore Swift

struct Foo { 
    let bar: (inout baz: String) ->() 
} 

Quando provo a costruire ottengo un errore:
Command failed due to signal: Segmentation fault: 11

Sto facendo qualcosa di sbagliato?

ho pensato che forse inout parametri chiusure non sono supportati, ma se io definisco una chiusura in questo modo:

let baz: (inout baz: String) ->() = { baz in 
    baz += "x" 
    return 
} 

o anche

var baz: (inout baz: String) ->()? 

si compila e funziona OK

+2

Ho aperto un ticket nel reporter di apple bug. Penso che sia un bug. Il compilatore Swift ora è un po 'bacato. – Shuo

+0

Nel tuo primo esempio il tipo non può essere trovato dal compilatore. Nel tuo secondo esempio il compilatore può trovarlo a causa del fatto che hai definito in modo indiretto. Nell'ultimo esempio è solo un optional quindi l'esistenza sarà sempre vera. – Alex

+0

sei corretto; questo fallisce. –

risposta

1

Appena testato in Swift 1.2 fornito con Xcode 6.3 beta, è stato compilato con successo. Quindi è stato sicuramente un bug sul compilatore che hanno risolto nell'ultima versione

0

@Bartek Chlebek. Nel codice che hai postato, c'è una cosa ambigua (va in grassetto): "lascia bar: (inout baz: String) ->()". Quando definisci la tua funzione in questo modo, dici al compilatore che stai per restituire una tupla vuota. Sembra che le versioni precedenti del compilatore non distinguessero (deve essere un bug nel tipo di motore di inferenza) il tipo Void e il "tipo di tupla vuoto" (che è denotato con "()"). Ecco un paio di parole sulla sintassi di tuple: https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Types.html#//apple_ref/doc/uid/TP40014097-CH31-ID448

Possibile soluzione: specificare esplicitamente il tipo di valore di ritorno (che è "vuoto" nel tuo caso). Spero che questo ti aiuti.

Problemi correlati