2016-04-04 11 views
1

Ich habe Code gefunden, als ich ein Buch über CoreData in Swift gelesen habe. Ich bin verwirrt über die Bedeutung des folgenden Codes. Was ist die Bedeutung bei der Deklaration der Schließung wie configurationBlock: NSFetchRequest ->() = { _ in }. vor allem die Bedeutung von {_ in}.Was bedeutet "{_ in}" in Swift?

public static func fetchInContext(context: NSManagedObjectContext, @noescape configurationBlock: NSFetchRequest ->() = { _ in }) -> [Self] { 
    let request = NSFetchRequest(entityName: Self.entityName) 
    configurationBlock(request) 
    guard let result = try! context.executeFetchRequest(request) as? [Self] else { fatalError("Fetched objects have wrong type") } 
    return result 
} 
+1

Es ist eine leere Standard-Schließung um die Tatsache zu umgehen, dass Sie '@ Noescape' nicht zu einem optionalen Abschluss-Argument zuweisen können. Siehe hier: http://stackoverflow.com/questions/33779777/how-to-add-noescape-annotation-to-option-closure – Hamish

+0

@ Kurt1018 Bitte lösche die Frage, die ich beantwortet habe. Ich habe mich viel Mühe gegeben, diese Frage zu beantworten. Löschen einer beantworteten Frage ist unhöflich (und kann Sie davon abhalten, Fragen zu SO zu stellen). Du solltest meine Antwort auf _reward_ mich akzeptieren, lösche deine Antwort nicht, um mich zu bestrafen. – matt

Antwort

9

Dies ist ein leerer Abschluss, der einen Parameter akzeptiert. In seiner vollen Form sieht ein Verschluss wie:

{ parameter: Type -> ReturnType in 
    // Stuff it does 
} 

Wenn ReturnType leer ist (keine Rückkehr), dann kann es weggelassen werden. Wenn Type abgeleitet werden kann, kann es weggelassen werden. Wenn parameter nicht verwendet wird, kann es durch _ ersetzt werden. Und wenn es keinen Körper gibt, gibt es keinen Körper. So können Sie mit nur diese aufzuwickeln, wenn Sie fertig:

{ _ in } 

In diesem speziellen Fall:

configurationBlock: NSFetchRequest ->() = { _ in }) 

configurationBlock eine Funktion ist, die eine NSFetchRequest und gibt nichts zurück nimmt, und der Standardwert ist ein Schließung, die nichts tut. Damit können Sie configurationBlock optional machen, ohne es in eine Optional zu verpacken. (Ich gehe hin und her über welchen Ansatz ich besser mag, aber beide sind in Ordnung.)

+0

Vielen Dank für die ausführliche Erklärung. Ich verstehe das vollkommen und lese dann etwas über die Funktion mit Default-Parameter. Sieht so aus, als ob ich mit der neuen Swift-Sprache noch einen langen Weg vor mir habe. – Kurt1018