2017-07-27 1 views
0
let _ = Timer.scheduledTimer(withTimeInterval: 2.0, repeats: true) { (timer) in 
    print("conunter \(counter += 1)") 
} 

Sortie:Pourquoi cela se passe-t-il dans Swift?

conunter() 
conunter() 
conunter() 
......... 

Mais si je le fais

let _ = Timer.scheduledTimer(withTimeInterval: 2.0, repeats: true) { (timer) in 
    counter += 1 
    print("conunter \(counter)") 
} 

Il produit résultat escompté. Pourquoi cela se passe-t-il?

+2

Un peu en rapport: [Quelle était la raison pour laquelle l'évaluation de l'affectation de Swift a été annulée?] (Https://stackoverflow.com/questions/34173084/what-was-the-reason-for-swift-assignment-evaluation-to- vide). –

Répondre

4

Parce que la fonction particulière de l'opérateur += a le type inout Int et un Int, et retourne (), alias Void

Ceci est une décision de conception intentionnelle mis en œuvre pour décourager l'utilisation de muter des effets secondaires dans d'autres expressions. Votre cas est à peu près exactement ce qu'ils espéraient empêcher.

Il peut être ennuyeux d'avoir une ligne supplémentaire pour cela, mais considérez ceci: est-ce vraiment le travail d'une instruction print pour incrémenter une variable? Cela ne ressemble pas à "imprimer" pour moi.

+0

merci pour votre explication. Pourriez-vous me donner une référence afin que je puisse en apprendre plus à ce sujet. – iMuzahid

+0

@ Md.MuzahidulIslam https://developer.apple.com/documentation/swift/numeric – Alexander

+0

Merci @Alexander – iMuzahid

0

Donc, fondamentalement, ce += est un opérateur Overload comme c++ il est donc une fonction qui renvoie le type Void() mentionné par réponse ci-dessus, il est donc l'impression conunter().

Après l'exécution de la déclaration de la fonction, il attribue la valeur de counter tellement plus facile à comprendre, la deuxième utilisation de counter aura la valeur.