2014-11-04 5 views
16

Alles, was ich tun muß, ist ein neues Projekt in Swift zu starten und zu main.swiftinout Parameter in Schließung stürzen den Swift-Compiler

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

hinzufügen Als ich zu bauen versuche ich eine Fehlermeldung erhalten:
Command failed due to signal: Segmentation fault: 11

Mache ich etwas falsch?

Ich dachte, dass vielleicht inout Parameter in Schließungen werden nicht unterstützt, aber wenn ich einen Verschluss wie so definieren:

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

oder sogar

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

es kompiliert und läuft OK

+2

Ich öffnete ein Ticket in Apple Bug Reporter. Ich denke, es ist ein Fehler. Swift Compiler ist jetzt ein kleiner Buggy. – Shuo

+0

In Ihrem ersten Beispiel kann der Typ vom Compiler nicht gefunden werden. In Ihrem zweiten Beispiel kann der Compiler es aufgrund der Tatsache finden, dass Sie indirekt definiert haben. Im letzten Beispiel ist es nur optional, so dass die Existenz immer wahr ist. – Alex

+0

Sie sind richtig; das schlägt fehl. –

Antwort

1

Ich habe es gerade in Swift 1.2 getestet, das mit Xcode 6.3 Beta geliefert wurde, und es wurde erfolgreich kompiliert. Also war es definitiv ein Fehler auf dem Compiler, den sie in der letzten Version

0

@Bartek Chlebek gelöst haben. In dem Code, den Sie gepostet haben, gibt es eine mehrdeutige Sache (geht in Fettschrift): "let bar: (inout baz: String) ->()". Wenn Sie Ihre Funktion so definieren, sagen Sie dem Compiler, dass Sie ein leeres Tupel zurückgeben werden. Es scheint, als ob die früheren Versionen des Compilers den Void-Typ und den "leeren Tupeltyp" (der mit "()" gekennzeichnet ist) nicht unterscheiden (muss ein Fehler in der Typ-Inferenz-Engine sein). Hier ist ein paar Wort über die Syntax von Tupeln: https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Types.html#//apple_ref/doc/uid/TP40014097-CH31-ID448

Mögliche Lösung: explizit den Rückgabewert Typ angeben (die „Void“ in Ihrem Fall ist). Hoffe das hilft.

Verwandte Themen