2016-04-18 8 views
3

In this Anwendung gibt es die Aussage:Swift Besondere Closure Syntax

var instanceCount = { globalHappinessInstanceCount++ }() 

Bei dem Versuch, die obige Aussage zu verstehen, habe ich gefunden, dass, soweit ich getestet habe, die Aussage unter das gleiche Ergebnis erzielt:

var instanceCount = globalHappinessInstanceCount++ 

Q1. Was ist die erste Aussage, die erreicht, dass die zweite nicht?

Q2. Sind die Klammern(), die dem Closure-Ausdruck folgen, ein leeres Tupel, Initialisersyntax, ... oder was? Wie soll man die erste Aussage lesen?

Antwort

1

Q1. Was ist die erste Aussage, die erreicht, dass die zweite nicht?

AFAIK es nur einen unnötigen Verschluss schafft, die keinen Wert ...

Q2 hinzuzufügt. Sind die Klammern(), die dem Closure-Ausdruck folgen, ein leeres Tupel, Initialisersyntax, ... oder was? Wie soll man die erste Aussage lesen?

Es ist Methodenaufruf. Genau wie

let foo = { globalHappinessInstanceCount++ } 
foo() 

Update:

ich nur den Code in Ihrem Link lesen, im Rahmen der Klassenbereich, ist es anders.

class HappinessViewController 
{ 
    var instanceCount = { globalHappinessInstanceCount++ }() 
} 

definiert eine Eigenschaft instanceCount: Int die globalHappinessInstanceCount++ Wert von

zugewiesen bekommen Es ist nicht so viel anders als var instanceCount = globalHappinessInstanceCount++

jedoch in Swift 3 wird ++ Betreiber entfernt werden, was Sie ändern möchten können es zu globalHappinessInstanceCount += 1. Aber das Problem ist der Ergebnistyp von += Operator ist Void statt Int. Also muss man es schreiben wie

class HappinessViewController 
{ 
    var instanceCount: Int = { 
     let instanceCount = globalInstanceCount 
     globalInstanceCount += 1 
     return instanceCount 
    }() 
} 
+0

Also selbst im Klassenrahmen ist die erste Aussage immer noch eine unnötige Schließung? –

+0

Ich glaube, wir müssen {globalHappinessInstanceCount + = 1} zurückstellen, weil ++ Postfix ist. –

+0

Also jetzt für Swift 3 veraltet ++ mussten wir hinzufügen: eine Int-Spezifikation, einen Defer-Block und eine return-Anweisung. Könnte dies ein hinreichender Grund sein, auf eine Umkehrung der veralteten Betreiberentscheidung zu drängen? –