Swift замыкания: Замыкания — SwiftBook – Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ замыкания Π² Swift ΠΏΠΎ ΠΏΠΎΠ»Π½ΠΎΠΉ / Habr

Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΠ΅

Замыкания — SwiftBook

Замыкания — это самодостаточныС Π±Π»ΠΎΠΊΠΈ с ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΠΎΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Ρ‹ ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Ρ‹ Π² вашСм ΠΊΠΎΠ΄Π΅. Замыкания Π² Swift ΠΏΠΎΡ…ΠΎΠΆΠΈ Π½Π° Π±Π»ΠΎΠΊΠΈ Π² C ΠΈ Objective-C, ΠΈ лямбды Π² Π΄Ρ€ΡƒΠ³ΠΈΡ… языках программирования.

Замыкания ΠΌΠΎΠ³ΡƒΡ‚ Π·Π°Ρ…Π²Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΈ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ссылки Π½Π° Π»ΡŽΠ±Ρ‹Π΅ константы ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΈΠ· контСкста, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΎΠ½ΠΈ ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Ρ‹. Π­Ρ‚Π° ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° извСстна ΠΊΠ°ΠΊ Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ этих констант ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, ΠΎΡ‚ΡΡŽΠ΄Π° ΠΈ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ «Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅». Swift выполняСт всю Ρ€Π°Π±ΠΎΡ‚Ρƒ с ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ ΠΏΡ€ΠΈ Π·Π°Ρ…Π²Π°Ρ‚Π΅ Π·Π° вас.

Π—Π°ΠΌΠ΅Ρ‚ΠΊΠ°

НС Π²ΠΎΠ»Π½ΡƒΠΉΡ‚Π΅ΡΡŒ, Ссли Π²Ρ‹ Π½Π΅ Π·Π½Π°ΠΊΠΎΠΌΡ‹ с понятиСм «Π·Π°Ρ…Π²Π°Ρ‚Π°»(capturing). Π­Ρ‚ΠΎ ΠΎΠ±ΡŠΡΡΠ½ΡΠ΅Ρ‚ΡΡ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ Π½ΠΈΠΆΠ΅ Π² Π³Π»Π°Π²Π΅ Π—Π°Ρ…Π²Π°Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ.

Π“Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΈ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±Ρ‹Π»ΠΈ прСдставлСны Π² Π³Π»Π°Π²Π΅ Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΡΠ²Π»ΡΡŽΡ‚ΡΡ частным случаСм Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠΉ. Замыкания ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ ΠΎΠ΄Π½Ρƒ ΠΈΠ· Ρ‚Ρ€Π΅Ρ… Ρ„ΠΎΡ€ΠΌ:

  • Π“Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΡΠ²Π»ΡΡŽΡ‚ΡΡ замыканиями, Ρƒ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π΅ΡΡ‚ΡŒ имя ΠΈ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ Π·Π°Ρ…Π²Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ Π½ΠΈΠΊΠ°ΠΊΠΈΠ΅ значСния.
  • Π’Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΡΠ²Π»ΡΡŽΡ‚ΡΡ замыканиями, Ρƒ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π΅ΡΡ‚ΡŒ имя ΠΈ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π·Π°Ρ…Π²Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ значСния ΠΈΠ· Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰Π΅ΠΉ ΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.
  • ВыраТСния замыкания ΡΠ²Π»ΡΡŽΡ‚ΡΡ бСзымянными замыканиями, написанныС Π² ΠΎΠ±Π»Π΅Π³Ρ‡Π΅Π½Π½ΠΎΠΌ синтаксисС, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π·Π°Ρ…Π²Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ значСния ΠΈΠ· ΠΈΡ… ΠΎΠΊΡ€ΡƒΠΆΠ°ΡŽΡ‰Π΅Π³ΠΎ контСкста.

ВыраТСния замыкания Π² Swift ΠΈΠΌΠ΅ΡŽΡ‚ Ρ‡Π΅Ρ‚ΠΊΠΈΠΉ, ясный, ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ синтаксис Π² распространСнных сцСнариях. Π­Ρ‚ΠΈ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚:

  • Π’Ρ‹Π²ΠΎΠ΄ Ρ‚ΠΈΠΏΠ° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ Ρ‚ΠΈΠΏΠ° значСния ΠΈΠ· контСкста
  • НСявныС Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‰ΠΈΠ΅ΡΡ значСния однострочных Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠΉ
  • Π‘ΠΎΠΊΡ€Π°Ρ‰Π΅Π½Π½Ρ‹Π΅ ΠΈΠΌΠ΅Π½Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ²
  • Бинтаксис ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠΉ

Π’Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±Ρ‹Π»ΠΈ прСдставлСны Π² Π³Π»Π°Π²Π΅ Π’Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΌ способом для обозначСния ΠΈ объявлСния самоорганизованных Π±Π»ΠΎΠΊΠΎΠ² ΠΊΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ Ρ‡Π°ΡΡ‚ΡŒΡŽ Π±ΠΎΠ»Π΅Π΅ ΠΊΡ€ΡƒΠΏΠ½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, ΠΈΠ½ΠΎΠ³Π΄Π° ΠΏΠΎΠ»Π΅Π·Π½ΠΎ ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΈΠ΅ вСрсии Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… конструкций, Π±Π΅Π· ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ объявлСния ΠΈ указания ΠΈΠΌΠ΅Π½ΠΈ. Π­Ρ‚ΠΎ особСнно Π²Π΅Ρ€Π½ΠΎ, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚Π΅ с функциями ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² Π²ΠΈΠ΄Π΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· своих ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ².

Π—Π°ΠΌΡ‹ΠΊΠ°ΡŽΡ‰ΠΈΠ΅ выраТСния, ΡΠ²Π»ΡΡŽΡ‚ΡΡ способом написания встроСнных Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠΉ Ρ‡Π΅Ρ€Π΅Π· ΠΊΡ€Π°Ρ‚ΠΊΠΈΠΉ ΠΈ спСциализированный синтаксис. Π—Π°ΠΌΡ‹ΠΊΠ°ΡŽΡ‰ΠΈΠ΅ выраТСния ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‚ нСсколько синтаксичСских ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΉ для написания Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠΉ Π² ΠΊΡ€Π°Ρ‚ΠΊΠΎΠΉ Ρ„ΠΎΡ€ΠΌΠ΅, Π±Π΅Π· ΠΏΠΎΡ‚Π΅Ρ€ΠΈ ясности ΠΈ Π½Π°ΠΌΠ΅Ρ€Π΅Π½ΠΈΠΉ. ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ Π·Π°ΠΌΡ‹ΠΊΠ°ΡŽΡ‰ΠΈΡ… Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ Π½ΠΈΠΆΠ΅, ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ эти ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΡƒΡ‚Π΅ΠΌ рассмотрСния ΠΌΠ΅Ρ‚ΠΎΠ΄Π° sorted(by:) ΠΏΡ€ΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… итСрациях, каТдая ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚ Ρ‚Ρƒ ΠΆΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Π² Π±ΠΎΠ»Π΅Π΅ сТатой Ρ„ΠΎΡ€ΠΌΠ΅.

ΠœΠ΅Ρ‚ΠΎΠ΄ sorted

Π’ стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ Swift Π΅ΡΡ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ sorted(by:), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ сортируСт массив Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°, ΠΎΡΠ½ΠΎΠ²Ρ‹Π²Π°ΡΡΡŒ Π½Π° Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ ΡΠΎΡ€Ρ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅Π³ΠΎ замыкания, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ Π΅ΠΌΡƒ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΄ΠΈΡ‚Π΅. ПослС Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ процСсса сортировки, ΠΌΠ΅Ρ‚ΠΎΠ΄ sorted(by:) Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π½ΠΎΠ²Ρ‹ΠΉ массив Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ Ρ‚ΠΈΠΏΠ° ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° ΠΊΠ°ΠΊ старый, с элСмСнтами Π² ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΌ порядкС сортировки. Π˜ΡΡ…ΠΎΠ΄Π½Ρ‹ΠΉ массив Π½Π΅ измСняСтся ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ sorted(by:).

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ Π·Π°ΠΌΡ‹ΠΊΠ°ΡŽΡ‰ΠΈΡ… Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ Π½ΠΈΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ sorted(by:)для сортировки массива ΠΈΠ· String Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π² ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΌ Π°Π»Ρ„Π°Π²ΠΈΡ‚Π½ΠΎΠΌ порядкС. Π’ΠΎΡ‚ исходный массив для сортировки:

let names = ["Chris", "Alex", "Ewa", "Barry", "Daniella"]

Π—Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° sorted(by:) ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π΄Π²Π° Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ Ρ‚ΠΈΠΏΠ°, Ρ‡Ρ‚ΠΎ ΠΈ содСрТимоС массива, ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Bool Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Ρ€Π΅ΡˆΠ°Π΅Ρ‚ ΠΏΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π»ΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅Π΄ Π²Ρ‚ΠΎΡ€Ρ‹ΠΌ, ΠΈΠ»ΠΈ послС Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ. Π—Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ сортировки Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ true, Ссли ΠΏΠ΅Ρ€Π²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Π΄ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ значСния, ΠΈ false Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС.

Π­Ρ‚ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ сортируСт массив ΠΈΠ· String Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ ΡΠΎΡ€Ρ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅Π΅ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ с Ρ‚ΠΈΠΏΠΎΠΌ (String, String) -> Bool.

Один ΠΈΠ· способов ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ ΡΠΎΡ€Ρ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅Π΅ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅, это Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π½ΡƒΠΆΠ½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°, ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Π΅Π³ΠΎ Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° ΠΌΠ΅Ρ‚ΠΎΠ΄Π° sorted(by:):

func backward(_ s1: String, _ s2: String) -> Bool {
   return s1 > s2
}
var reversedNames = names.sorted(by: backward)
// reversedNames Ρ€Π°Π²Π΅Π½ ["Ewa", "Daniella", "Chris", "Barry", "Alex"]

Если пСрвая строка (s1) большС Ρ‡Π΅ΠΌ вторая строка (s2), функция backward(_:_:) Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ true, Ρ‡Ρ‚ΠΎ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ s1 Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄ s2 Π² сортированном массивС. Для символов Π² строках, «Π±ΠΎΠ»ΡŒΡˆΠ΅ Ρ‡Π΅ΠΌ» ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ «ΠΏΠΎΡΠ²Π»ΡΠ΅Ρ‚ся Π² Π°Π»Ρ„Π°Π²ΠΈΡ‚Π΅ ΠΏΠΎΠ·ΠΆΠ΅, Ρ‡Π΅ΠΌ». Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Ρ‡Ρ‚ΠΎ Π±ΡƒΠΊΠ²Π° «B» «Π±ΠΎΠ»ΡŒΡˆΠ΅ Ρ‡Π΅ΠΌ» Π±ΡƒΠΊΠ²Π° «Π», Π° строка «Tom» большС Ρ‡Π΅ΠΌ строка «Tim». Π­Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ ΠΎΠ±Ρ€Π°Ρ‚Π½ΡƒΡŽ Π°Π»Ρ„Π°Π²ΠΈΡ‚Π½ΡƒΡŽ сортировку, с «Barry» поставлСнным ΠΏΠ΅Ρ€Π΅Π΄ «Alex», ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅.

Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, это довольно скучный способ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΠΎ сути, являСтся Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ с ΠΎΠ΄Π½ΠΈΠΌ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ (a > b). Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅, Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Ρ‚ΠΈΡ‚Π΅Π»ΡŒΠ½Π΅Π΅ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΡΠΎΡ€Ρ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅Π΅ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ Π² ΠΎΠ΄Π½Ρƒ строку, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ синтаксис Π·Π°ΠΌΡ‹ΠΊΠ°ΡŽΡ‰Π΅Π³ΠΎ выраТСния.

Бинтаксис Π·Π°ΠΌΡ‹ΠΊΠ°ΡŽΡ‰Π΅Π³ΠΎ выраТСния

Бинтаксис Π·Π°ΠΌΡ‹ΠΊΠ°ΡŽΡ‰Π΅Π³ΠΎ выраТСния ΠΈΠΌΠ΅Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΠΎΠ±Ρ‰ΡƒΡŽ Ρ„ΠΎΡ€ΠΌΡƒ:

  1. { (ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹) -> Ρ‚ΠΈΠΏ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° in
  2. выраТСния
  3. }

Бинтаксис Π·Π°ΠΌΡ‹ΠΊΠ°ΡŽΡ‰Π΅Π³ΠΎ выраТСния ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΒ ΡΠΊΠ²ΠΎΠ·Π½Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹. ЗначСния ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Ρ‹. Π’Π°Ρ€ΠΈΠ°Ρ‚ΠΈΠ²Π½Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Ρ‹ Π² любом мСстС Π² спискС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ². ΠšΠΎΡ€Ρ‚Π΅ΠΆΠΈ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Ρ‹ ΠΊΠ°ΠΊ Ρ‚ΠΈΠΏΡ‹ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΈ ΠΊΠ°ΠΊ Ρ‚ΠΈΠΏΡ‹ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ значСния.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π½ΠΈΠΆΠ΅ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π²Π΅Ρ€ΡΠΈΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ backwards(_:_:) с использованиСм Π·Π°ΠΌΡ‹ΠΊΠ°ΡŽΡ‰Π΅Π³ΠΎ выраТСния:

reversedNames = names.sorted(by: { (s1: String, s2: String) -> Bool in
   return s1 > s2
})

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ объявлСниС Ρ‚ΠΈΠΏΠΎΠ² ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΈ Ρ‚ΠΈΠΏΠ° Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ значСния для этого однострочного замыкания ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½ΠΎ объявлСнию ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ backwards(_:_:). Π’ ΠΎΠ±ΠΎΠΈΡ… случаях, ΠΎΠ½ΠΎ ΠΏΠΈΡˆΠ΅Ρ‚ΡΡ Π² Π²ΠΈΠ΄Π΅ (s1: String, s2: String) -> Bool. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, для однострочных Π·Π°ΠΌΡ‹ΠΊΠ°ΡŽΡ‰ΠΈΡ… Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ, ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΈ Ρ‚ΠΈΠΏ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ значСния ΠΏΠΈΡˆΡƒΡ‚ΡΡ Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ„ΠΈΠ³ΡƒΡ€Π½Ρ‹Ρ… скобок, Π° Π½Π΅ Π²Π½Π΅ ΠΈΡ….

Начало Ρ‚Π΅Π»Π° замыкания содСрТит ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово in. Π­Ρ‚ΠΎ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ объявлСниС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ значСния замыкания Π·Π°ΠΊΠΎΠ½Ρ‡Π΅Π½ΠΎ, ΠΈ Ρ‚Π΅Π»ΠΎ замыкания вот-Π²ΠΎΡ‚ начнСтся.

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρ‚Π΅Π»ΠΎ замыкания Π½Π°ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΎΠ΅, ΠΎΠ½ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ записано Π² ΠΎΠ΄Π½Ρƒ строку:

reversedNames = names.sorted(by: { (s1: String, s2: String) -> Bool in return s1 > s2 })

Π­Ρ‚ΠΎ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΎΠ±Ρ‰ΠΈΠΉ Π²Ρ‹Π·ΠΎΠ² ΠΌΠ΅Ρ‚ΠΎΠ΄Π°Β sorted остался ΠΏΡ€Π΅ΠΆΠ½ΠΈΠΌ. ΠŸΠ°Ρ€Π° скобок ΠΏΠΎ-ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ ΠΎΠ±ΠΎΡΠΎΠ±Π»ΡΡŽΡ‚ вСсь Π½Π°Π±ΠΎΡ€ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΌΠ΅Ρ‚ΠΎΠ΄Π°.

ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° ΠΈΠ· контСкста

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΡΠΎΡ€Ρ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅Π΅ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ пСрСдаСтся ΠΊΠ°ΠΊ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°, Swift ΠΌΠΎΠΆΠ΅Ρ‚ вывСсти Ρ‚ΠΈΠΏΡ‹ Π΅Π³ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΈ Ρ‚ΠΈΠΏ возвращаСмого значСния, Ρ‡Π΅Ρ€Π΅Π· Ρ‚ΠΈΠΏ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° ΠΌΠ΅Ρ‚ΠΎΠ΄Π° sorted(by:). Π­Ρ‚ΠΎΡ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΈΠΌΠ΅ΡŽΡ‰ΡƒΡŽ Ρ‚ΠΈΠΏ (String, String) -> Bool. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Ρ‡Ρ‚ΠΎ Ρ‚ΠΈΠΏΡ‹ (String, String) ΠΈ Bool Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΈΡΠ°Ρ‚ΡŒ Π² объявлСнии Π·Π°ΠΌΡ‹ΠΊΠ°ΡŽΡ‰Π΅Π³ΠΎ выраТСния. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ всС Ρ‚ΠΈΠΏΡ‹ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹Π²Π΅Π΄Π΅Π½Ρ‹, стрСлка Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° ( -> ) ΠΈ скобки Π²ΠΎΠΊΡ€ΡƒΠ³ ΠΈΠΌΠ΅Π½ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠΏΡƒΡ‰Π΅Π½Ρ‹:

reversedNames = names.sorted(by: { s1, s2 in return s1 > s2 })

ВсСгда ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ‚ΠΈΠΏΡ‹ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΈ Ρ‚ΠΈΠΏ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ значСния, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅ΠΌ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² Π²ΠΈΠ΄Π΅ однострочного Π·Π°ΠΌΡ‹ΠΊΠ°ΡŽΡ‰Π΅Π³ΠΎ выраТСния. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅, ΠΊΠΎΠ³Π΄Π° Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΊΠ°ΠΊ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°, Π²Π°ΠΌ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΈΡΠ°Ρ‚ΡŒ однострочноС Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ Π² Π΅Π³ΠΎ ΠΏΠΎΠ»Π½ΠΎΠΌ Π²ΠΈΠ΄Π΅.

Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, Π²Ρ‹ всё Ρ€Π°Π²Π½ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ явно ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Ρ‚ΠΈΠΏΡ‹, Ссли Ρ…ΠΎΡ‚ΠΈΡ‚Π΅. И Π΄Π΅Π»Π°Ρ‚ΡŒ это прСдполагаСтся, Ссли это ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ двусмыслСнности для Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π»Π΅ΠΉ вашСго ΠΊΠΎΠ΄Π°. Π’ случаС с ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ sorted(by:), Ρ†Π΅Π»ΡŒ замыкания понятна ΠΈΠ· Ρ‚ΠΎΠ³ΠΎ Ρ„Π°ΠΊΡ‚Π°, Ρ‡Ρ‚ΠΎ сортировка происходит, ΠΈ ΠΎΠ½Π° бСзопасна для читатСля, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅, вСроятно, Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ со значСниями String, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ΠΎ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ ΡΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ массив ΠΈΠ· строк.

НСявныС Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Π΅ значСния ΠΈΠ· Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠΉ с ΠΎΠ΄Π½ΠΈΠΌ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ

Замыкания с ΠΎΠ΄Π½ΠΈΠΌ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ ΠΌΠΎΠ³ΡƒΡ‚ нСявно Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ своСго выраТСния Ρ‡Π΅Ρ€Π΅Π· опусканиС ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ слова return ΠΈΠ· ΠΈΡ… объявлСния, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² этой вСрсии ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°:

reversedNames = names.sorted(by: { s1, s2 in s1 > s2 })

Π—Π΄Π΅ΡΡŒ, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ Ρ‚ΠΈΠΏ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° ΠΌΠ΅Ρ‚ΠΎΠ΄Π° sorted(by:)Π΄Π°Π΅Ρ‚ ΠΏΠΎΠ½ΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ Π²Π΅Ρ€Π½Π΅Ρ‚ Bool Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρ‚Π΅Π»ΠΎ замыкания содСрТит ΠΎΠ΄Π½ΠΎ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ (s1 > s2), ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Bool Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Ρ‚ΠΎ Π½Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ двусмыслСнности, ΠΈ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово return ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ.

Π‘ΠΎΠΊΡ€Π°Ρ‰Π΅Π½Π½Ρ‹Π΅ ΠΈΠΌΠ΅Π½Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ²

Swift автоматичСски прСдоставляСт сокращённыС ΠΈΠΌΠ΅Π½Π° для однострочных Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Ρ‹ для обращСния ΠΊ значСниям ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² замыкания Ρ‡Π΅Ρ€Π΅Π· ΠΈΠΌΠ΅Π½Π° $0, $1, $2, ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅.

Если Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ эти сокращСнныС ΠΈΠΌΠ΅Π½Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² с вашим Π·Π°ΠΌΡ‹ΠΊΠ°ΡŽΡ‰ΠΈΠΌ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΡ€ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ список ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² замыкания ΠΈΠ· Π΅Π³ΠΎ объявлСния, Π° количСство ΠΈ Ρ‚ΠΈΠΏ сокращСнных ΠΈΠΌΠ΅Π½ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π²Π΅Π΄Π΅Π½ΠΎ ΠΈΠ· ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° ΠΌΠ΅Ρ‚ΠΎΠ΄Π°. ΠšΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово in Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠΏΡƒΡ‰Π΅Π½ΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π·Π°ΠΌΡ‹ΠΊΠ°ΡŽΡ‰Π΅Π΅ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ состоит ΠΈΠ· Π΅Π³ΠΎ Ρ‚Π΅Π»Π°:

reversedNames = names.sorted(by: { $0 > $1 })

Π—Π΄Π΅ΡΡŒ, $0 ΠΈ $1 ΠΎΠ±Ρ€Π°Ρ‰Π°ΡŽΡ‚ΡΡ ΠΊ ΠΏΠ΅Ρ€Π²ΠΎΠΌΡƒ ΠΈ Π²Ρ‚ΠΎΡ€ΠΎΠΌΡƒ String ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρƒ замыкания.

ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

Π—Π΄Π΅ΡΡŒ Π΅ΡΡ‚ΡŒ Π½Π° самом Π΄Π΅Π»Π΅ Π±ΠΎΠ»Π΅Π΅ ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΈΠΉ способ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π·Π°ΠΌΡ‹ΠΊΠ°ΡŽΡ‰Π΅Π΅ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π²Ρ‹ΡˆΠ΅. Π’ΠΈΠΏ String Π² Swift опрСдСляСт свою ΡΠΏΠ΅Ρ†ΠΈΡ„ΠΈΡ‡Π½ΡƒΡŽ для строк Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° большС ( > ) ΠΊΠ°ΠΊ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΈΠΌΠ΅ΡŽΡ‰Π΅ΠΉ Π΄Π²Π° строковых ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‰Π΅ΠΉ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° Bool. Π­Ρ‚ΠΎ Ρ‚ΠΎΡ‡Π½ΠΎ соотвСтствуСт Ρ‚ΠΈΠΏΡƒ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°, для ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° ΠΌΠ΅Ρ‚ΠΎΠ΄Π° sorted(by:). Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ просто Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ большС, Π° Swift Π±ΡƒΠ΄Π΅Ρ‚ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡΠΏΠ΅Ρ†ΠΈΡ„ΠΈΡ‡Π½ΡƒΡŽ для строк Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ:

reversedNames = names.sorted(by: >)

Π‘ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π½Ρ‹Ρ… функциях смотритС Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

Если Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ замыкания Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² качСствС послСднСго Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ само Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ замыкания Π΄Π»ΠΈΠ½Π½ΠΎΠ΅, Ρ‚ΠΎ ΠΎΠ½ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ записано Π² Π²ΠΈΠ΄Π΅ ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ замыкания. ΠŸΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ — Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ записано Π² Π²ΠΈΠ΄Π΅ Π·Π°ΠΌΡ‹ΠΊΠ°ΡŽΡ‰Π΅Π³ΠΎ выраТСния Π²Π½Π΅ (ΠΈ послС) ΠΊΡ€ΡƒΠ³Π»Ρ‹Ρ… скобок Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π΄Π°ΠΆΠ΅ нСсмотря Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΎ всС Π΅Ρ‰Π΅ являСтся Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Когда Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ синтаксис ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎΒ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΡ, Ρ‚ΠΎ Π²Ρ‹ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΠΈΡΠ°Ρ‚ΡŒ ярлык Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° замыкания Π² качСствС части Π²Ρ‹Π·ΠΎΠ²Π° самой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

func someFunctionThatTakesAClosure(closure: () -> Void) {
   // Ρ‚Π΅Π»ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ
}
 
// Π’ΠΎΡ‚ ΠΊΠ°ΠΊ Π²Ρ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚Π΅ эту Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π±Π΅Π· использования ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ замыкания:
 
someFunctionThatTakesAClosure(closure: {
   // Ρ‚Π΅Π»ΠΎ замыкания
})
 
// Π’ΠΎΡ‚ ΠΊΠ°ΠΊ Π²Ρ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚Π΅ эту Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ с использованиСм ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ замыкания:
 
someFunctionThatTakesAClosure() {
   // Ρ‚Π΅Π»ΠΎ ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ замыкания
}

Π‘ΠΎΡ€Ρ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅Π΅ строки Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ ΠΈΠ· Ρ€Π°Π·Π΄Π΅Π»Π° Бинтаксис Π·Π°ΠΌΡ‹ΠΊΠ°ΡŽΡ‰Π΅Π³ΠΎ выраТСния моТСт Π±Ρ‹Ρ‚ΡŒ записано Π²Π½Π΅ ΠΊΡ€ΡƒΠ³Π»Ρ‹Ρ… скобок Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ sorted(by:), ΠΊΠ°ΠΊ ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅:

reversedNames = names.sorted() { $0 > $1 }

Если Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ замыкания являСтся СдинствСнным Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΈ Π²Ρ‹ ΠΏΠΈΡˆΠ΅Ρ‚Π΅ Π΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ синтаксис ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ замыкания, Ρ‚ΠΎ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ написаниС ΠΊΡ€ΡƒΠ³Π»Ρ‹Ρ… скобок Π²Ρ‹Π·ΠΎΠ²Π° самой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ послС Π΅Π΅ ΠΈΠΌΠ΅Π½ΠΈ.

reversedNames = names.sorted { $0 > $1 }

ΠŸΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ замыкания ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ Π² случаях, ΠΊΠΎΠ³Π΄Π° само Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ достаточно Π΄Π»ΠΈΠ½Π½ΠΎΠ΅, ΠΈ Π΅Π³ΠΎ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π² ΠΎΠ΄Π½Ρƒ строку. Π’ качСствС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅ΠΌ Π²Π°ΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄ map(_:) Ρ‚ΠΈΠΏΠ° Array Π² языкС Swift, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ замыкания ΠΊΠ°ΠΊ Π΅Π³ΠΎ СдинствСнный Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚. Π—Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ вызываСтся ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ Ρ€Π°Π·Ρƒ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ элСмСнта массива ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½ΡƒΡŽ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅ΠΌΡƒΡŽ Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Ρƒ (Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°) для этого элСмСнта. ΠŸΡ€ΠΈΡ€ΠΎΠ΄Π° отобраТСния ΠΈ Ρ‚ΠΈΠΏ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ значСния опрСдСляСтся Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ΠΌ.

ПослС примСнСния замыкания ΠΊ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ элСмСнту массива, ΠΌΠ΅Ρ‚ΠΎΠ΄ map(_:) Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π½ΠΎΠ²Ρ‹ΠΉ массив, содСрТащий Π½ΠΎΠ²Ρ‹Π΅ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Ρ‹, Π² Ρ‚ΠΎΠΌ ΠΆΠ΅ порядкС, Ρ‡Ρ‚ΠΎ ΠΈ Π² исходном массивС.

Π’ΠΎΡ‚ ΠΊΠ°ΠΊ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ map(_:) вмСстС с ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ΠΌ для прСвращСния массива Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Ρ‚ΠΈΠΏΠ° Int Π² массив Ρ‚ΠΈΠΏΠ° String. Массив [16, 58, 510] ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для создания Π½ΠΎΠ²ΠΎΠ³ΠΎ массива [«OneSix», «FiveEight», «FiveOneZero»] :

let digitNames = [
    0: "Zero", 1: "One", 2: "Two",   3: "Three", 4: "Four",
    5: "Five", 6: "Six", 7: "Seven", 8: "Eight", 9: "Nine"
]
let numbers = [16, 58, 510]

Код Π²Ρ‹ΡˆΠ΅ создаСт ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°ΡŽΡ‰ΠΈΠΉ Ρ†ΠΈΡ„Ρ€Ρ‹ ΠΈ ΠΈΡ… Π°Π½Π³Π»ΠΈΠΉΡΠΊΡƒΡŽΒ Π²Π΅Ρ€ΡΠΈΡŽΒ ΠΈΠΌΠ΅Π½. Π’Π°ΠΊ ΠΆΠ΅ ΠΎΠ½ ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚ массив Ρ†Π΅Π»Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ для прСобразования Π² массив строк.

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ массив numbers для создания Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Ρ‚ΠΈΠΏΠ° String, ΠΏΠ΅Ρ€Π΅Π΄Π°Π² Π·Π°ΠΌΡ‹ΠΊΠ°ΡŽΡ‰Π΅Π΅ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π² ΠΌΠ΅Ρ‚ΠΎΠ΄ map(_:) массива Π² качСствС ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ замыкания. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π²Ρ‹Π·ΠΎΠ² number.map Π½Π΅ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π² сСбя скобки послС map, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄ map(_:) ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ ΠΈΠΌΠ΅Π΅ΠΌ Π² Π²ΠΈΠ΄Π΅ ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ замыкания:

let strings = numbers.map { (number) -> String in
    var number = number
    var output = ""
    repeat {
        output = digitNames[number % 10]! + output
        number /= 10
    } while number > 0
    return output
}

//Ρ‚ΠΈΠΏ строк Π±Ρ‹Π» Π²Ρ‹Π²Π΅Π΄Π΅Π½ ΠΊΠ°ΠΊ [String]
//значСния ["OneSix", "FiveEight", "FiveOneZero"]

ΠœΠ΅Ρ‚ΠΎΠ΄ map(_:) Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ элСмСнта массива. Π’Π°ΠΌ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Ρ‚ΠΈΠΏ Π²Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° замыкания, number, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Ρ‚ΠΈΠΏ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹Π²Π΅Π΄Π΅Π½ ΠΈΠ· Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ массива, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ примСняСт ΠΌΠ΅Ρ‚ΠΎΠ΄ map.

Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ пСрСмСнная number ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π° ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ значСния ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° замыкания number, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΎ Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ‚Π΅Π»Π° замыкания. (ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈ замыкания всСгда ΡΠ²Π»ΡΡŽΡ‚ΡΡ константами.) Π’Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ замыкания Ρ‚Π°ΠΊ ΠΆΠ΅ опрСдСляСт Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹ΠΉ Ρ‚ΠΈΠΏ String для указания Ρ‚ΠΈΠΏΠ°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒΡΡ Π² массивС Π½Π° Π²Ρ‹Ρ…ΠΎΠ΄Π΅ ΠΈΠ· ΠΌΠ΅Ρ‚ΠΎΠ΄Π° map(_:).

Π—Π°ΠΌΡ‹ΠΊΠ°ΡŽΡ‰Π΅Π΅ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ строит строку, Π½Π°Π·Π²Π°Π½Π½ΡƒΡŽ output, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ΠΎ вызываСтся. Оно рассчитываСт послСднюю Ρ†ΠΈΡ„Ρ€Ρƒ number, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ дСлСния с остатком ( number % 10 ) ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Β Π·Π°Ρ‚Π΅ΠΌ эту ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ²ΡˆΡƒΡŽΡΡ Ρ†ΠΈΡ„Ρ€Ρƒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π°ΠΉΡ‚ΠΈ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΡƒΡŽ строку Π² словарС digitNames. Π­Ρ‚ΠΎ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ использовано для создания строкового прСдставлСния любого цСлого числа, большСго Ρ‡Π΅ΠΌ 0.

Π—Π°ΠΌΠ΅Ρ‚ΠΊΠ°

Π’Ρ‹Π·ΠΎΠ² словаря digitNames синтаксисом сабскрипта сопровоТдаСтся Π·Π½Π°ΠΊΠΎΠΌ (!), ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ сабскрипт словаря Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π΅ΡΡ‚ΡŒ такая Π²Π΅Ρ€ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ³ΠΎ ΠΊΠ»ΡŽΡ‡Π° Π² словарС ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈ Π½Π΅ Π±Ρ‹Ρ‚ΡŒ. Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π²Ρ‹ΡˆΠ΅ ΠΌΡ‹ Ρ‚ΠΎΡ‡Π½ΠΎ Π·Π½Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ number % 10 всСгда Π²Π΅Ρ€Π½Π΅Ρ‚ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠ»ΡŽΡ‡ словаря digitNames, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Π²ΠΎΡΠΊΠ»ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Π·Π½Π°ΠΊ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ извлСчСния значСния Ρ‚ΠΈΠΏΠ° String Π² Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠΌ ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΈ сабскрипта.

Π‘Ρ‚Ρ€ΠΎΠΊΠ°, получСнная ΠΈΠ· словаря digitNames, добавляСтся Π² Π½Π°Ρ‡Π°Π»ΠΎ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ output, ΠΏΡƒΡ‚Π΅ΠΌ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ³ΠΎ формирования строковой вСрсии числа Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚.(Π’Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ number % 10 Π΄Π°Π΅Ρ‚ Π½Π°ΠΌ 6 для 16, 8 для 58 ΠΈ 0 для 510).

ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ number послС вычислСния остатка дСлится Π½Π° 10. Π’Π°ΠΊ ΠΊΠ°ΠΊ Ρ‚ΠΈΠΏ значСния Int, Ρ‚ΠΎ нашС число округляСтся Π²Π½ΠΈΠ·, Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ 16 прСвращаСтся Π² 1, 58 Π² 5, 510 Π² 51.

ΠŸΡ€ΠΎΡ†Π΅ΡΡ повторяСтся ΠΏΠΎΠΊΠ° number /= 10 Π½Π΅ станСт Ρ€Π°Π²Π½Ρ‹ΠΌ 0, послС Ρ‡Π΅Π³ΠΎ строка output возвращаСтся Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ΠΌ ΠΈ добавляСтся ΠΊ Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠΌΡƒ массиву Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ map(_:).

ИспользованиС синтаксиса ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠΉ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π²Ρ‹ΡˆΠ΅ Π°ΠΊΠΊΡƒΡ€Π°Ρ‚Π½ΠΎ инкапсулируСт Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ замыкания сразу послС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ map(_:), ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚, Π±Π΅Π· нСобходимости заворачивания всСго замыкания Π²Π½ΡƒΡ‚Ρ€ΡŒ Π²Π½Π΅ΡˆΠ½ΠΈΡ… ΠΊΡ€ΡƒΠ³Π»Ρ‹Ρ… скобок Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ map(_:).

Замыкания ΠΌΠΎΠ³ΡƒΡ‚ Π·Π°Ρ…Π²Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ константы ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΈΠ· ΠΎΠΊΡ€ΡƒΠΆΠ°ΡŽΡ‰Π΅Π³ΠΎ контСкста, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΎΠ½ΠΎ объявлСно. ПослС Π·Π°Ρ…Π²Π°Ρ‚Π° Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΡΡ‹Π»Π°Ρ‚ΡŒΡΡ ΠΈΠ»ΠΈ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ значСния этих констант ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Π²Π½ΡƒΡ‚Ρ€ΠΈ своСго Ρ‚Π΅Π»Π°, Π΄Π°ΠΆΠ΅ Ссли ΠΎΠ±Π»Π°ΡΡ‚ΡŒ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π±Ρ‹Π»ΠΈ ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Ρ‹ эти константы ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΡƒΠΆΠ΅ большС Π½Π΅ сущСствуСт.

Π’ Swift самая простая Ρ„ΠΎΡ€ΠΌΠ° замыкания ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Ρ…Π²Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ значСния ΠΈΠ· Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, написанных Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ‚Π΅Π»Π° Π΄Ρ€ΡƒΠ³ΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. ВлоТСнная функция ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Ρ…Π²Π°Ρ‚ΠΈΡ‚ΡŒ Π»ΡŽΠ±Ρ‹Π΅ значСния ΠΈΠ· Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΎΠΊΡ€ΡƒΠΆΠ°ΡŽΡ‰Π΅ΠΉ Π΅Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π° Ρ‚Π°ΠΊ ΠΆΠ΅ константы ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Π½Ρ‹Π΅ Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ‚Π΅Π»Π° внСшнСй Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ makeIncrementer, которая содСрТит Π²Π»ΠΎΠΆΠ΅Π½Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ incrementer. ВлоТСнная функция incrementer() Π·Π°Ρ…Π²Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ Π΄Π²Π° значСния runningTotal ΠΈ amount ΠΈΠ· ΠΎΠΊΡ€ΡƒΠΆΠ°ΡŽΡ‰Π΅Π³ΠΎ контСкста. ПослС Π·Π°Ρ…Π²Π°Ρ‚Π° этих Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ incrementer возвращаСтся Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ makeIncrementer ΠΊΠ°ΠΊ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ runningTotal Π½Π° amount ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· ΠΊΠ°ΠΊ вызываСтся.

func makeIncrementer(forIncrement amount: Int) -> () -> Int {
   var runningTotal = 0
   func incrementer() -> Int {
      runningTotal += amount
      return runningTotal
   }
   return incrementer
}

Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹ΠΉ Ρ‚ΠΈΠΏ makeIncrementer Void -> Int. Π­Ρ‚ΠΎ Π·Π½Π°Ρ‡ΠΈΡ‚, Ρ‡Ρ‚ΠΎ ΠΎΠ½ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, Π° Π½Π΅ простоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. ВозвращСнная функция Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Int ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· ΠΊΠ°ΠΊ Π΅Π΅ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚. Π£Π·Π½Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π² Π³Π»Π°Π²Π΅ «Π€ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹ ΠΊΠ°ΠΊ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Π΅ Ρ‚ΠΈΠΏΡ‹».

Ѐункция makeIncrementer(forIncrement:) ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚ Ρ†Π΅Π»ΠΎΡ‡ΠΈΡΠ»Π΅Π½Π½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ runningTotal, для хранСния Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ значСния ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ΠΎΡ€Π°, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½ΠΎ. ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ инициализируСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ 0.

Ѐункция makeIncrementer(forIncrement:) ΠΈΠΌΠ΅Π΅Ρ‚ СдинствСнный ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Int с внСшним ΠΈΠΌΠ΅Π½Π΅ΠΌ forIncrement ΠΈ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ amount. Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° пСрСдаСтся этому ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρƒ, опрСдСляя Π½Π° сколько Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ runningTotal ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

Ѐункция makeIncrementer ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚ Π²Π»ΠΎΠΆΠ΅Π½Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ incrementer, которая нСпосрСдствСнно ΠΈ занимаСтся ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅ΠΌ значСния. Π­Ρ‚Π° функция просто добавляСт amount ΠΊ runningTotal ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚.

Если Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ incrementer() ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ, Ρ‚ΠΎ ΠΎΠ½Π° ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ Π½Π΅ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΉ:

func incrementer() -> Int {
    runningTotal += amount
    return runningTotal
}

Ѐункция incrementer() Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ Π½ΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° ΠΈ ΠΎΠ½Π° ссылаСтся Π½Π° runningTotal ΠΈ amount Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ‚Π΅Π»Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Она Π΄Π΅Π»Π°Π΅Ρ‚ это, захватывая ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ значСния ΠΎΡ‚ runningTotal ΠΈ amount ΠΈΠ· ΠΎΠΊΡ€ΡƒΠΆΠ°ΡŽΡ‰Π΅ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΈΡ… Π²Π½ΡƒΡ‚Ρ€ΠΈ. Π—Π°Ρ…Π²Π°Ρ‚ ссылки Π΄Π°Π΅Ρ‚ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡŽ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ runningTotal Π½Π΅ исчСзнСт ΠΏΡ€ΠΈ ΠΎΠΊΠΎΠ½Ρ‡Π°Π½ΠΈΠΈ Π²Ρ‹Π·ΠΎΠ²Π° makeIncrementer ΠΈ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ runningTotal останСтся ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Π²Π°Π½Π° функция incrementer().

Π—Π°ΠΌΠ΅Ρ‚ΠΊΠ°

Π’ качСствС ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ Swift ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Ρ…Π²Π°Ρ‚ΠΈΡ‚ΡŒ ΠΈ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΊΠΎΠΏΠΈΡŽΒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡ, Ссли это Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π½Π΅ измСняСтся самим Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ΠΌ, Π° Ρ‚Π°ΠΊ ΠΆΠ΅ Π½Π΅ измСняСтся послС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ Π±Ρ‹Π»ΠΎ создано.Β Swift Ρ‚Π°ΠΊΠΆΠ΅ Π±Π΅Ρ€Π΅Ρ‚ Π½Π° сСбя ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ ΠΏΠΎ ΡƒΡ‚ΠΈΠ»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ΠΈ Π±ΠΎΠ»Π΅Π΅ Π½Π΅ Π½ΡƒΠΆΠ½Ρ‹.

ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ makeIncrementer Π² дСйствии:

let incrementByTen = makeIncrementer(forIncrement: 10)

Π­Ρ‚ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ заставляСт константу incrementByTen ΡΡΡ‹Π»Π°Ρ‚ΡŒΡΡ Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ΠΎΡ€Π°, которая добавляСт 10 ΠΊ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ runningTotal ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· ΠΊΠ°ΠΊ вызываСтся. ΠœΠ½ΠΎΠ³ΠΎΠΊΡ€Π°Ρ‚Π½Ρ‹ΠΉ Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π΅Π΅ Π² дСйствии:

incrementByTen()
// Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ 10
incrementByTen()
// Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ 20
incrementByTen()
// Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ 30

Если Π²Ρ‹ создаСтС Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ΠΎΡ€, ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ свою ΡΠΎΠ±ΡΡ‚Π²Π΅Π½Π½ΡƒΡŽ ссылку Π½Π° Π½ΠΎΠ²ΡƒΡŽ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ runningTotal :

let incrementBySeven = makeIncrementer(forIncrement: 7)
incrementBySeven()
//Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 7

ΠŸΠΎΠ²Ρ‚ΠΎΡ€Π½Ρ‹ΠΉ Π²Ρ‹Π·ΠΎΠ² ΠΏΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ΠΎΡ€Π° ( incrementByTen ) заставит ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Ρ‚ΡŒΡΡ Π΅Π³ΠΎ ΡΠΎΠ±ΡΡ‚Π²Π΅Π½Π½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ runningTotal ΠΈ Π½ΠΈΠΊΠ°ΠΊ Π½Π΅ повлияСт Π½Π° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ, Π·Π°Ρ…Π²Π°Ρ‡Π΅Π½Π½ΡƒΡŽ Π² incrementBySeven :

incrementByTen()
//Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ 40
Π—Π°ΠΌΠ΅Ρ‚ΠΊΠ°

Если Π²Ρ‹ присваиваСтС Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ свойству экзСмпляра класса, ΠΈ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ Π·Π°Ρ…Π²Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ этот экзСмпляр ΠΏΠΎ ссылкС Π½Π° Π½Π΅Π³ΠΎ ΠΈΠ»ΠΈ Π΅Π³ΠΎ Ρ‡Π»Π΅Π½Ρ‹, Π²Ρ‹ создаСтС ΡΠΈΠ»ΡŒΠ½Ρ‹Π΅ ΠΎΠ±Ρ€Π°Ρ‚Π½Ρ‹Π΅ связи ΠΌΠ΅ΠΆΠ΄Ρƒ экзСмпляром ΠΈ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ΠΌ. Swift ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ списки Π·Π°Ρ…Π²Π°Ρ‚Π°, для Ρ€Π°Π·Ρ€Ρ‹Π²Π° этих ΡΠΈΠ»ΡŒΠ½Ρ‹Ρ… ΠΎΠ±Ρ€Π°Ρ‚Π½Ρ‹Ρ… связСй. ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Π² Π³Π»Π°Π²Π΅ Π¦ΠΈΠΊΠ»Ρ‹ ΡΠΈΠ»ΡŒΠ½Ρ‹Ρ… ссылок для Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠΉ.

Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π²Ρ‹ΡˆΠ΅ incrementBySeven ΠΈ incrementByTen константы, Π½ΠΎ замыкания, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΡΡ‹Π»Π°ΡŽΡ‚ΡΡ эти константы ΠΈΠΌΠ΅ΡŽΡ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… runningTotal, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ½ΠΈ Π·Π°Ρ…Π²Π°Ρ‚ΠΈΠ»ΠΈ. Π­Ρ‚ΠΎ ΠΈΠ·-Π·Π° Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ замыкания ΡΠ²Π»ΡΡŽΡ‚ΡΡ ссылочными Ρ‚ΠΈΠΏΠ°ΠΌΠΈ.

Когда Π±Ρ‹ Π²Ρ‹ Π½ΠΈ присваивали Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΈΠ»ΠΈ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ константС ΠΈΠ»ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, Π²Ρ‹ фактичСски присваиваСтС ссылку этой константС ΠΈΠ»ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π½Π° эту Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΈΠ»ΠΈ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅. Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π²Ρ‹ΡˆΠ΅ Π²Ρ‹Π±ΠΎΡ€ замыкания, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ссылаСтся incrementByTen, константа, Π½ΠΎ Π½Π΅ содСрТимоС самого замыкания.

Π­Ρ‚ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅ Π·Π½Π°Ρ‡ΠΈΡ‚, Ρ‡Ρ‚ΠΎ Ссли Π²Ρ‹ присвоитС Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ Π΄Π²ΡƒΠΌ Ρ€Π°Π·Π½Ρ‹ΠΌ константам ΠΈΠ»ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ, Ρ‚ΠΎ ΠΎΠ±Π° ΠΎΠ½ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ ΡΡΡ‹Π»Π°Ρ‚ΡŒΡΡ Π½Π° ΠΎΠ΄Π½ΠΎ ΠΈ Ρ‚ΠΎ ΠΆΠ΅ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅:

let alsoIncrementByTen = incrementByTen
alsoIncrementByTen()
//Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ 50

Когда говорят, Ρ‡Ρ‚ΠΎ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ сбСгаСт из Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ρ‚ΠΎ это Π·Π½Π°Ρ‡ΠΈΡ‚, Ρ‡Ρ‚ΠΎ это Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ Π±Ρ‹Π»ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½ΠΎ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° ΠΈ вызываСтся ΡƒΠΆΠ΅ послС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ функция Π²Π΅Ρ€Π½ΡƒΠ»Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Когда Π²Ρ‹ ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая ΠΈΠΌΠ΅Π΅Ρ‚ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ Π² качСствС ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ², Ρ‚ΠΎ Π²Ρ‹ ΠΏΠΈΡˆΠΈΡ‚Π΅ @escaping Π΄ΠΎ Ρ‚ΠΈΠΏΠ° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°, для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠ±Π΅ΠΆΠ°Ρ‚ΡŒ.

Если Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ хранится Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, которая Π±Ρ‹Π»Π° объявлСна Π²Π½Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π° Π·Π°Ρ‚Π΅ΠΌ эта пСрСмСнная Π±Ρ‹Π»Π° ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π° Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, Ρ‚ΠΎ получаСтся, Ρ‡Ρ‚ΠΎ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ посрСдством ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ пСрСдаСтся Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, ΡΠ±Π΅Π³Π°ΡŽΡ‰Π΅Π΅. Π’ качСствС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ,Β ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚Β Π°ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½Π½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π² Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‰Π΅ΠΌ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ являСтся Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ΠΌ. Π’ΠΎ Π΅ΡΡ‚ΡŒ получаСтся, Ρ‡Ρ‚ΠΎ функция Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ свою Ρ€Π°Π±ΠΎΡ‚Ρƒ, послС Ρ‡Π΅Π³ΠΎ вызываСтся Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‰ΠΈΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ. Или Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ Π½Π΅ вызываСтся, ΠΏΠΎΠΊΠ° Π½Π΅ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡΡ Ρ€Π°Π±ΠΎΡ‚Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ получаСтся, Ρ‡Ρ‚ΠΎ Π΄Π°Π½Π½ΠΎΠΌΡƒ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΡŽ Π½ΡƒΠΆΠ½ΠΎ ΡΠ±Π΅ΠΆΠ°Ρ‚ΡŒ ΠΈΠ· области Ρ€Π°Π±ΠΎΡ‚Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡ‚Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΏΠΎΠ·ΠΆΠ΅. НапримСр:

var completionHandlers: [() -> Void] = []
func someFunctionWithEscapingClosure(completionHandler: @escaping () -> Void) {
  completionHandlers.append(completionHandler)
}

Ѐункция someFunctionWithEscapingClosure(_:) ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΈ добавляСт Π² массив Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅, объявлСнноС Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Π°ΠΌΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Если Π²Ρ‹ Π½Π΅ поставитС ΠΌΠ°Ρ€ΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒΒ @escaping, Ρ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ ΠΎΡˆΠΈΠ±ΠΊΡƒ компиляции.

ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ замыкания Ρ‡Π΅Ρ€Π΅Π·Β @escaping ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡΠΎΡΠ»Π°Ρ‚ΡŒΡΡ Π½Π° self явно Π²Π½ΡƒΡ‚Ρ€ΠΈ самого замыкания. НапримСр, Π² ΠΊΠΎΠ΄Π΅ Π½ΠΈΠΆΠ΅, Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ пСрСдаСтся Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ someFunctionWithEscapingClosure(_:) Π² Π²ΠΈΠ΄Π΅ ΡΠ±Π΅Π³Π°ΡŽΡ‰Π΅Π³ΠΎ замыкания, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΡΡΡ‹Π»Π°Ρ‚ΡŒΡΡ Π½Π° self Π²Π½ΡƒΡ‚Ρ€ΠΈ Π½Π΅Π³ΠΎ явно. Π‘ Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅, ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΠΎΠ΅ Π²Β someFunctionWithNonescapingClosure(_:) являСтся Π½Π΅ΡΠ±Π΅Π³Π°ΡŽΡ‰ΠΈΠΌ, Π·Π½Π°Ρ‡ΠΈΡ‚ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΡΡ‹Π»Π°Ρ‚ΡŒΡΡ Π½Π° self нСявно.

func someFunctionWithNonescapingClosure(closure: () -> Void) {
    closure()
}
 
class SomeClass {
    var x = 10
    func doSomething() {
        someFunctionWithEscapingClosure { self.x = 100 }
        someFunctionWithNonescapingClosure { x = 200 }
    }
}
 
let instance = SomeClass()
instance.doSomething()
print(instance.x)
// Π’Ρ‹Π²Π΅Π΄Π΅Ρ‚ "200"
 
completionHandlers.first?()
print(instance.x)
// Π’Ρ‹Π²Π΅Π΄Π΅Ρ‚ "100"

Автозамыкания — замыкания, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ автоматичСски ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ для Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ выраТСния, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π±Ρ‹Π»ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½ΠΎ Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°Β Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π’Π°ΠΊΠΈΠ΅ замыкания Π½Π΅ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ ΠΈΒ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ выраТСния, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΎ Π²Π½ΡƒΡ‚Ρ€ΠΈ Π½Π΅Π΅. БинтаксичСски Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΊΡ€ΡƒΠ³Π»Ρ‹Π΅ скобки Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²ΠΎΠΊΡ€ΡƒΠ³ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, просто записав ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ΅ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ вмСсто явного замыкания.

НСт Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ³ΠΎ Π² Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ автозамыкания, Π½ΠΎ Π½Π΅ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌ являСтся Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. НапримСр, функция assert(condition:message:file:line:) ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ автозамыкания Π½Π° мСсто condition ΠΈ message ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ². Π•Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ condition вычисляСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² сборкС Π΄Π΅Π±Π°Π³Π³Π΅Ρ€Π°, Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ message вычисляСтся, Ссли Ρ‚ΠΎΠ»ΡŒΠΊΠΎ condition Ρ€Π°Π²Π΅Π½ false.

Автозамыкания ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ Π²Π°ΠΌ ΠΎΡ‚ΠΊΠ»Π°Π΄Ρ‹Π²Π°Ρ‚ΡŒ вычислСния, ΠΏΠΎΡ‚ΠΎΠΌΡƒ ΠΊΠ°ΠΊ ΠΊΠΎΠ΄ Π²Π½ΡƒΡ‚Ρ€ΠΈ Π½ΠΈΡ… Π½Π΅ исполняСтся, ΠΏΠΎΠΊΠ° Π²Ρ‹ сами Π΅Π³ΠΎ Π½Π΅ запуститС. Π­Ρ‚ΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ для ΠΊΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ сторонниС эффСкты ΠΈΠ»ΠΈ просто являСтся Π΄ΠΎΡ€ΠΎΠ³ΠΈΠΌ Π² Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΌ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΈ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ врСмя исполнСния этого ΠΊΠΎΠ΄Π°. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π½ΠΈΠΆΠ΅ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚ ΠΊΠ°ΠΊ замыкания ΠΎΡ‚ΠΊΠ»Π°Π΄Ρ‹Π²Π°ΡŽΡ‚ вычислСния:

var customersInLine = ["Chris", "Alex", "Ewa", "Barry", "Daniella"]
print(customersInLine.count)
// Π’Ρ‹Π²Π΅Π΄Π΅Ρ‚ "5"
 
let customerProvider = { customersInLine.remove(at: 0) }
print(customersInLine.count)
// Π’Ρ‹Π²Π΅Π΄Π΅Ρ‚ "5"
 
print("Now serving \(customerProvider())!")
// Π’Ρ‹Π²Π΅Π΄Π΅Ρ‚ "Now serving Chris!"
print(customersInLine.count)
// Π’Ρ‹Π²Π΅Π΄Π΅Ρ‚ "4"

Π”Π°ΠΆΠ΅ Ссли ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ элСмСнт массива customersInLine удаляСтся кодом Π²Π½ΡƒΡ‚Ρ€ΠΈ замыкания, элСмСнт массива фактичСски Π½Π΅ удаляСтся Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€ ΠΏΠΎΠΊΠ° само Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Π²Π°Π½ΠΎ. Если Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ Ρ‚Π°ΠΊ ΠΈ Π½Π΅ вызываСтся, Ρ‚ΠΎ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π²Π½ΡƒΡ‚Ρ€ΠΈ Π½Π΅Π³ΠΎ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ выполнится ΠΈ, соотвСтствСнно, элСмСнт Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠ΄Π°Π»Π΅Π½ ΠΈΠ· массива. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ customerProvider являСтся Π½Π΅ String, Π° () -> String, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ функция Π½Π΅ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ², Π½ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ строку. Π’Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ Ρ‚ΠΎ ΠΆΠ΅ самоС ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅, ΠΊΠΎΠ³Π΄Π° сдСлаСтС это Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:

// customersInLine Ρ€Π°Π²Π΅Π½ ["Alex", "Ewa", "Barry", "Daniella"]
func serve(customer customerProvider: () -> String) {
    print("Now serving \(customerProvider())!")
}
serve(customer: { customersInLine.remove(at: 0) } )
// Π’Ρ‹Π²Π΅Π΄Π΅Ρ‚ "Now serving Alex!"

Ѐункция serve(customer:) описанная Π²Ρ‹ΡˆΠ΅ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ явноС Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ имя ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°. ВСрсия Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ serve(customer:)Β Π½ΠΈΠΆΠ΅ выполняСт Ρ‚Ρƒ ΠΆΠ΅ ΡΠ°ΠΌΡƒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ, Π½ΠΎ вмСсто использования явного замыкания, ΠΎΠ½Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π°Π²Ρ‚ΠΎΠ·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅, поставив ΠΌΠ°Ρ€ΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° @autoclosure. Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, ΠΊΠ°ΠΊ Π±ΡƒΠ΄Ρ‚ΠΎ Π±Ρ‹ ΠΎΠ½Π° ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ String вмСсто замыкания. АргумСнт автоматичСски прСобразуСтся Π² Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Ρ‚ΠΈΠΏ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° customerProvider ΠΈΠΌΠ΅Π΅Ρ‚ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ @autoclosure.

// customersInLine Ρ€Π°Π²Π΅Π½ ["Ewa", "Barry", "Daniella"]
func serve(customer customerProvider: @autoclosure () -> String) {
    print("Now serving \(customerProvider())!")
}
serve(customer: customersInLine.remove(at: 0))
// Π’Ρ‹Π²Π΅Π΄Π΅Ρ‚ "Now serving Ewa!"
Π—Π°ΠΌΠ΅Ρ‚ΠΊΠ°

Блишком частоС использованиС Π°Π²Ρ‚ΠΎΠ·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ваш ΠΊΠΎΠ΄ слоТным для чтСния. ΠšΠΎΠ½Ρ‚Π΅ΠΊΡΡ‚ ΠΈ имя Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°Ρ‚ΡŒ ΡΡΠ½ΠΎΡΡ‚ΡŒ отлоТСнности исполнСния ΠΊΠΎΠ΄Π°.

Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π°Π²Ρ‚ΠΎΠ·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ ΠΌΠΎΠ³Π»ΠΎ ΡΠ±Π΅ΠΆΠ°Ρ‚ΡŒ, Ρ‚ΠΎ Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±Π° Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° ΠΈ @autoclosure, ΠΈ @escaping. Атрибут @escaping ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ описан Π² Π³Π»Π°Π²Π΅ Π‘Π±Π΅Π³Π°ΡŽΡ‰ΠΈΠ΅ замыкания.

// customersInLine Ρ€Π°Π²Π΅Π½ ["Barry", "Daniella"]
var customerProviders: [() -> String] = []
func collectCustomerProviders(_ customerProvider: @autoclosure @escaping () -> String) {
    customerProviders.append(customerProvider)
}
collectCustomerProviders(customersInLine.remove(at: 0))
collectCustomerProviders(customersInLine.remove(at: 0))
 
print("Collected \(customerProviders.count) closures.")
// Π’Ρ‹Π²Π΅Π΄Π΅Ρ‚ "Collected 2 closures."
for customerProvider in customerProviders {
    print("Now serving \(customerProvider())!")
}
// Π’Ρ‹Π²Π΅Π΄Π΅Ρ‚ "Now serving Barry!"
// Π’Ρ‹Π²Π΅Π΄Π΅Ρ‚ "Now serving Daniella!"

Π’ ΠΊΠΎΠ΄Π΅ Π²Ρ‹ΡˆΠ΅, вмСсто Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½ΠΎΠ΅ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° customer, функция collectCustomerProviders(_:) добавляСт Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ ΠΊ массиву customerProviders. Массив объявлСн Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Π°ΠΌΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ρ‡Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ Π² массивС ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ исполнСно послС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ функция Π²Π΅Ρ€Π½Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° customerProvider Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠΌΠ΅Ρ‚ΡŒ β€œΡ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅β€ Π½Π° β€œΠΏΠΎΠ±Π΅Π³β€ ΠΈΠ· Π·ΠΎΠ½Ρ‹ видимости Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

Если Π²Ρ‹ нашли ΠΎΡˆΠΈΠ±ΠΊΡƒ, поТалуйста, Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚Π΅ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ тСкста ΠΈ Π½Π°ΠΆΠΌΠΈΡ‚Π΅ Ctrl+Enter.

Если Π²Ρ‹ нашли ΠΎΡˆΠΈΠ±ΠΊΡƒ, поТалуйста, Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚Π΅ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ тСкста ΠΈ Π½Π°ΠΆΠΌΠΈΡ‚Π΅ Ctrl+Enter.

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ замыкания Π² Swift ΠΏΠΎ ΠΏΠΎΠ»Π½ΠΎΠΉ / Habr

НСсмотря Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π² Objective-C 2.0 ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‚ замыкания (извСстныС ΠΊΠ°ΠΊ Π±Π»ΠΎΠΊΠΈ), Ρ€Π°Π½Π΅Π΅ эппловский API использовал ΠΈΡ… Π½Π΅ΠΎΡ…ΠΎΡ‚Π½ΠΎ. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, отчасти поэтому ΠΌΠ½ΠΎΠ³ΠΈΠ΅ программисты ΠΏΠΎΠ΄ iOS с ΡƒΠ΄ΠΎΠ²ΠΎΠ»ΡŒΡΡ‚Π²ΠΈΠ΅ΠΌ эксплуатировали сторонниС Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, Π²Ρ€ΠΎΠ΄Π΅ AFNetworking, Π³Π΄Π΅ Π±Π»ΠΎΠΊΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ повсСмСстно. Π‘ Π²Ρ‹Ρ…ΠΎΠ΄ΠΎΠΌ Swift, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ Π½ΠΎΠ²ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π² API, Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с замыканиями стало Ρ‡Ρ€Π΅Π·Π²Ρ‹Ρ‡Π°ΠΉΠ½ΠΎ ΡƒΠ΄ΠΎΠ±Π½ΠΎ. Π”Π°Π²Π°ΠΉΡ‚Π΅ рассмотрим, ΠΊΠ°ΠΊΠΈΠΌΠΈ особСнностями ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ‚ ΠΈΡ… синтаксис Π² Swift, ΠΈ ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚Ρ€ΡŽΠΊΠΈ ΠΌΠΎΠΆΠ½ΠΎ с Π½ΠΈΠΌΠΈ Β«Π²Ρ‹Ρ‚Π²ΠΎΡ€ΡΡ‚ΡŒΒ».

ΠŸΡ€ΠΎΠ΄Π²ΠΈΠ³Π°Ρ‚ΡŒΡΡ Π±ΡƒΠ΄Π΅ΠΌ ΠΎΡ‚ простого ΠΊ слоТному, ΠΎΡ‚ скучного ΠΊ вСсСлому. Π—Π°Ρ€Π°Π½Π΅Π΅ ΠΏΡ€ΠΈΠ½ΠΎΡˆΡƒ извинСния Π·Π° обильноС использованиС ΠΌΠ°Π½Ρ‚Ρ€ «функция», Β«ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Β» ΠΈ Β«DoubleΒ», Π½ΠΎ ΠΈΠ· пСсни слов Π½Π΅ Π²Ρ‹ΠΊΠΈΠ½Π΅ΡˆΡŒ.


1.1. ΠžΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ класса

Для Π½Π°Ρ‡Π°Π»Π° укрСпимся с ΠΌΡ‹ΡΠ»ΡŒΡŽ, Ρ‡Ρ‚ΠΎ Π² Swift Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΡΠ²Π»ΡΡŽΡ‚ΡΡ носитСлями Π³ΠΎΡ€Π΄ΠΎΠ³ΠΎ статуса ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ класса. Π­Ρ‚ΠΎ Π·Π½Π°Ρ‡ΠΈΡ‚, Ρ‡Ρ‚ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΌΠΎΠΆΠ½ΠΎ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ Π² качСствС Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π΄Ρ€ΡƒΠ³ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Вводится понятиС Β«Ρ‚ΠΈΠΏΠ° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈΒ». Π­Ρ‚ΠΎΡ‚ Ρ‚ΠΈΠΏ описываСт Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚ΠΈΠΏ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ значСния, Π½ΠΎ ΠΈ Ρ‚ΠΈΠΏΡ‹ Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ².
Допустим, Ρƒ нас Π΅ΡΡ‚ΡŒ Π΄Π²Π΅ ΠΏΠΎΡ…ΠΎΠΆΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ Π΄Π²Π΅ матСматичСскиС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ слоТСния ΠΈ вычитания:
func add(op1: Double, op2: Double) -> Double {
    return op1 + op2
}

func subtract(op1: Double, op2: Double) -> Double {
    return op1 - op2
}

Π˜Ρ… Ρ‚ΠΈΠΏ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:
(Double, Double) -> Double

ΠŸΡ€ΠΎΡ‡Π΅ΡΡ‚ΡŒ это ΠΌΠΎΠΆΠ½ΠΎ Ρ‚Π°ΠΊ: Β«ΠŸΠ΅Ρ€Π΅Π΄ Π½Π°ΠΌΠΈ Ρ‚ΠΈΠΏ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ с двумя Π²Ρ…ΠΎΠ΄Π½Ρ‹ΠΌΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ Ρ‚ΠΈΠΏΠ° Double ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ Ρ‚ΠΈΠΏΠ° Double.Β»
ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ Ρ‚Π°ΠΊΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°:
// ΠžΠΏΠΈΡΡ‹Π²Π°Π΅ΠΌ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ
var operation: (Double, Double) -> Double

// Π‘ΠΌΠ΅Π»ΠΎ присваиваСм этой ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅
// Π½ΡƒΠΆΠ½ΠΎΠΉ Π½Π°ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π² зависимости ΠΎΡ‚ ΠΊΠ°ΠΊΠΈΡ…-Π»ΠΈΠ±ΠΎ условий:
for i in 0..<2 {
    if i == 0 {
        operation = add
    } else {
        operation = subtract
    }
    
    let result = operation(1.0, 2.0) // "Π’Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ" ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ
    println(result)
}

Код, описанный Π²Ρ‹ΡˆΠ΅, Π²Ρ‹Π²Π΅Π΄Π΅Ρ‚ Π² консоли:
3.0
-1.0
1.2. Замыкания

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Π΅Ρ‰Π΅ ΠΎΠ΄Π½Ρƒ ΠΏΡ€ΠΈΠ²ΠΈΠ»Π΅Π³ΠΈΡŽ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ класса. Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡΡΡŒ ΠΊ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌΡƒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ, ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΡƒΡŽ Π½ΠΎΠ²ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая Π±Ρ‹ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π»Π° ΠΎΠ΄Π½Ρƒ ΠΈΠ· Π½Π°ΡˆΠΈΡ… старых Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Ρ‚ΠΈΠΏΠ° (Double, Double) -> Double Π² качСствС послСднСго ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°. Π’ΠΎΡ‚ Ρ‚Π°ΠΊ ΠΎΠ½Π° Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ:
// (1)
func performOperation(op1: Double, op2: Double, operation: (Double, Double) -> Double) -> Double { // (2)
    return operation(op1, op2) // (3)
}

Π Π°Π·Π±Π΅Ρ€Π΅ΠΌ Π·Π°ΠΏΡƒΡ‚Π°Π½Π½Ρ‹ΠΉ синтаксис Π½Π° ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠ΅. Ѐункция performOperation ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Ρ‚Ρ€ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°:
  • op1 Ρ‚ΠΈΠΏΠ° Double (op β€” сокращСнноС ΠΎΡ‚ Β«ΠΎΠΏΠ΅Ρ€Π°Π½Π΄Β»)
  • op2 Ρ‚ΠΈΠΏΠ° Double
  • operation Ρ‚ΠΈΠΏΠ° (Double, Double) -> Double

Π’ своСм Ρ‚Π΅Π»Π΅ performOperation просто Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ρ…Ρ€Π°Π½ΠΈΠΌΠΎΠΉ Π² ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π΅ operation, пСрСдавая Π² Π½Π΅Π³ΠΎ ΠΏΠ΅Ρ€Π²Ρ‹Ρ… Π΄Π²Π° своих ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°.
Пока Ρ‡Ρ‚ΠΎ выглядит Π·Π°ΠΏΡƒΡ‚Π°Π½Π½ΠΎ, ΠΈ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π΄Π°ΠΆΠ΅ Π½Π΅ понятно. НСмного тСрпСния, господа.

Π”Π°Π²Π°ΠΉΡ‚Π΅ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΄ΠΈΠΌ Π² качСствС Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅Π³ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° Π½Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ, Π° Π°Π½ΠΎΠ½ΠΈΠΌΠ½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, Π·Π°ΠΊΠ»ΡŽΡ‡ΠΈΠ² Π΅Π΅ Π² Ρ„ΠΈΠ³ΡƒΡ€Π½Ρ‹Π΅ {} скобки. ΠŸΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹ΠΉ Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ΠΌ:

let result = performOperation(1.0, 2.0, {(op1: Double, op2: Double) -> Double in
    return op1 + op2 // (5)
}) // (4)
println(result) // Π’Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ 3.0 Π² консоли

ΠžΡ‚Ρ€Ρ‹Π²ΠΎΠΊ ΠΊΠΎΠ΄Π° (op1: Double, op2: Double) -> Double in β€” это, Ρ‚Π°ΠΊ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, Β«Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊΒ» замыкания. Бостоит ΠΎΠ½ ΠΈΠ·:
  • псСвдонимов op1, op2 Ρ‚ΠΈΠΏΠ° Double для использования Π²Π½ΡƒΡ‚Ρ€ΠΈ замыкания
  • Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ значСния замыкания -> Double
  • ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ слова in

Π•Ρ‰Π΅ Ρ€Π°Π· ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ сСйчас ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΎ, ΠΏΠΎ ΠΏΡƒΠ½ΠΊΡ‚Π°ΠΌ:
(1) ОбъявлСна функция performOperation
(2) Π­Ρ‚Π° функция ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Ρ‚Ρ€ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°. Π”Π²Π° ΠΏΠ΅Ρ€Π²Ρ‹Ρ… β€” ΠΎΠΏΠ΅Ρ€Π°Π½Π΄Ρ‹. ПослСдний β€” функция, которая Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π° Π½Π°Π΄ этими ΠΎΠΏΠ΅Ρ€Π°Π½Π΄Π°ΠΌΠΈ.
(3) performOperation Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ.
(4) Π’ качСствС послСднСго ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Π² performOperation Π±Ρ‹Π»Π° ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π° функция, описанная Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ΠΌ.
(5) Π’ Ρ‚Π΅Π»Π΅ замыкания указываСтся, какая опСрация Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π½Π°Π΄ ΠΎΠΏΠ΅Ρ€Π°Π½Π΄Π°ΠΌΠΈ.
Авторы Swift ΠΏΡ€ΠΈΠ»ΠΎΠΆΠΈΠ»ΠΈ Π½Π΅ΠΌΠ°Π»ΠΎ усилий, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ языка ΠΌΠΎΠ³Π»ΠΈ ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ мСньшС ΠΊΠΎΠ΄Π° ΠΈ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ большС Ρ‚Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ своС Π΄Ρ€Π°Π³ΠΎΡ†Π΅Π½Π½ΠΎΠ΅ врСмя Π½Π° Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ Π₯Π°Π±Ρ€Π° Ρ€Π°Π·ΠΌΡ‹ΡˆΠ»Π΅Π½ΠΈΡ ΠΎΠ± Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°. Взяв Π·Π° основу наш ΠΏΡ€ΠΈΠΌΠ΅Ρ€ с арифмСтичСскими опСрациями, посмотрим, Π΄ΠΎ ΠΊΠ°ΠΊΠΎΠ³ΠΎ состояния ΠΌΡ‹ смоТСм Π΅Π³ΠΎ Β«Ρ€Π°ΡΠΊΡ€ΡƒΡ‚ΠΈΡ‚ΡŒΒ».
2.1. ИзбавляСмся ΠΎΡ‚ Ρ‚ΠΈΠΏΠΎΠ² ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅.

Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, ΠΌΠΎΠΆΠ½ΠΎ Π½Π΅ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Ρ‚ΠΈΠΏΡ‹ Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Π² Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠΈ явно, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ компилятор ΡƒΠΆΠ΅ Π·Π½Π°Π΅Ρ‚ ΠΎ Π½ΠΈΡ…. Π’Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ выглядит Ρ‚Π°ΠΊ:
performOperation(1.0, 2.0, {(op1, op2) -> Double in
    return op1 + op2
})

2.2. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ синтаксис «хвостового замыкания».

Π’ΠΎ-Π²Ρ‚ΠΎΡ€Ρ‹Ρ…, Ссли Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ пСрСдаСтся Π² качСствС послСднСго ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, Ρ‚ΠΎ синтаксис позволяСт ΡΠΎΠΊΡ€Π°Ρ‚ΠΈΡ‚ΡŒ запись, ΠΈ ΠΊΠΎΠ΄ замыкания просто прикрСпляСтся ΠΊ хвосту Π²Ρ‹Π·ΠΎΠ²Π°:
performOperation(1.0, 2.0) {(op1, op2) -> Double in
    return op1 + op2
}

2.3. НС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово Β«returnΒ».

ΠŸΡ€ΠΈΡΡ‚Π½Π°Ρ (Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… случаях) ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒ языка Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Ссли ΠΊΠΎΠ΄ замыкания умСщаСтся Π² ΠΎΠ΄Π½Ρƒ строку, Ρ‚ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния этой строки автоматичСси Π±ΡƒΠ΄Π΅Ρ‚ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово Β«returnΒ» ΠΌΠΎΠΆΠ½ΠΎ Π½Π΅ ΠΏΠΈΡΠ°Ρ‚ΡŒ:
performOperation(1.0, 2.0) {(op1, op2) -> Double in
    op1 + op2
}

2.4. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ стСнографичСскиС ΠΈΠΌΠ΅Π½Π° для ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ².

ИдСм дальшС. Π˜Π½Ρ‚Π΅Ρ€Π΅ΡΠ½ΠΎ, Ρ‡Ρ‚ΠΎ Swift позволяСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π°ΠΊ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹Π΅ стСнографичСскиС (Π°Π½Π³Π». shorthand) ΠΈΠΌΠ΅Π½Π° для Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Π² Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠΈ. Π’.Π΅. ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρƒ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ присваиваСтся псСвдоним Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ $n, Π³Π΄Π΅ n β€” порядковый Π½ΠΎΠΌΠ΅Ρ€ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°, начиная с нуля. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π½Π°ΠΌ, оказываСтся, Π΄Π°ΠΆΠ΅ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠ΄ΡƒΠΌΡ‹Π²Π°Ρ‚ΡŒ ΠΈΠΌΠ΅Π½Π° для Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ². Π’ Ρ‚Π°ΠΊΠΎΠΌ случаС вСсь Β«Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊΒ» замыкания ΡƒΠΆΠ΅ Π½Π΅ нСсСт Π² сСбС Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ смысловой Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ, ΠΈ Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ:
performOperation(1.0, 2.0) { $0 + $1 }

Π‘ΠΎΠ³Π»Π°ΡΠΈΡ‚Π΅ΡΡŒ, эта запись ΡƒΠΆΠ΅ совсСм Π½Π΅ ΠΏΠΎΡ…ΠΎΠΆΠ° Π½Π° Ρ‚Ρƒ, которая Π±Ρ‹Π»Π° Π² самом Π½Π°Ρ‡Π°Π»Π΅.
2.5. Π₯ΠΎΠ΄ ΠΊΠΎΠ½Π΅ΠΌ: ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

ВсС это Π±Ρ‹Π»ΠΈ Π΅Ρ‰Π΅ Ρ†Π²Π΅Ρ‚ΠΎΡ‡ΠΊΠΈ. БСйчас Π±ΡƒΠ΄Π΅Ρ‚ ягодка.
Π”Π°Π²Π°ΠΉΡ‚Π΅ посмотрим Π½Π° ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΡƒΡŽ запись ΠΈ зададимся вопросом, Ρ‡Ρ‚ΠΎ ΡƒΠΆΠ΅ Π·Π½Π°Π΅Ρ‚ компилятор ΠΎ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠΈ? Он Π·Π½Π°Π΅Ρ‚ количСство ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² (2) ΠΈ ΠΈΡ… Ρ‚ΠΈΠΏΡ‹ (Double ΠΈ Double). Π—Π½Π°Π΅Ρ‚ Ρ‚ΠΈΠΏ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ значСния (Double). Π’Π°ΠΊ ΠΊΠ°ΠΊ Π² ΠΊΠΎΠ΄Π΅ замыкания выполняСтся всСго ΠΎΠ΄Π½Π° строка, ΠΎΠ½ Π·Π½Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π΅ΠΌΡƒ Π½ΡƒΠΆΠ½ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ Π² качСствС Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° Π΅Π³ΠΎ выполнСния. МоТно Π»ΠΈ ΡƒΠΏΡ€ΠΎΡΡ‚ΠΈΡ‚ΡŒ эту запись ΠΊΠ°ΠΊ-Ρ‚ΠΎ Π΅Ρ‰Π΅?
ΠžΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ΡΡ, ΠΌΠΎΠΆΠ½ΠΎ. Если Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с двумя Π²Ρ…ΠΎΠ΄Π½Ρ‹ΠΌΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ, Π² качСствС замыкания Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅Ρ‚ΡΡ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π½Π°Π΄ этими Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ (ΠΎΠΏΠ΅Ρ€Π°Π½Π΄Π°ΠΌΠΈ). Π’Π΅ΠΏΠ΅Ρ€ΡŒ наш Π²Ρ‹Π·ΠΎΠ² Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:
performOperation(1.0, 2.0, +)

ΠšΡ€Π°ΡΠΎΡ‚Π°!
Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒ элСмСнтарныС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π½Π°Π΄ нашими ΠΎΠΏΠ΅Ρ€Π°Π½Π΄Π°ΠΌΠΈ Π² зависимости ΠΎΡ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… условий, написав ΠΏΡ€ΠΈ этом ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ ΠΊΠΎΠ΄Π°.

ΠšΡΡ‚Π°Ρ‚ΠΈ, Swift Ρ‚Π°ΠΊΠΆΠ΅ позволяСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ сравнСния Π² качСствС ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΈΡ†ΠΈΠΈ. Π’Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ это Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Ρ‚Π°ΠΊ:

func performComparisonOperation(op1: Double, op2: Double, operation: (Double, Double) -> Bool) -> Bool {
    return operation(op1, op2)
}

println(performComparisonOperation(1.0, 1.0, >=)) // Π’Ρ‹Π²Π΅Π΄Π΅Ρ‚ "true"
println(performComparisonOperation(1.0, 1.0, <)) // Π’Ρ‹Π²Π΅Π΄Π΅Ρ‚ "false"

Или Π±ΠΈΡ‚ΠΎΠ²Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ:
func performBitwiseOperation(op1: Bool, op2: Bool, operation: (Bool, Bool) -> Bool) -> Bool {
    return operation(op1, op2)
}

println(performBitwiseOperation(true, true, ^)) // Π’Ρ‹Π²Π΅Π΄Π΅Ρ‚ "false"
println(performBitwiseOperation(true, false, |)) // Π’Ρ‹Π²Π΅Π΄Π΅Ρ‚ "true"

Swift β€” Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Ρ€ΠΎΠ΄Π΅ Π·Π°Π±Π°Π²Π½Ρ‹ΠΉ язык программирования. НадСюсь, ΡΡ‚Π°Ρ‚ΡŒΡ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ для Ρ‚Π΅Ρ…, ΠΊΡ‚ΠΎ Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ Π·Π½Π°ΠΊΠΎΠΌΠΈΡ‚ΡŒΡΡ с этим языком, Π° Ρ‚Π°ΠΊΠΆΠ΅ для Ρ‚Π΅Ρ…, ΠΊΠΎΠΌΡƒ просто интСрСсно, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΌ происходит Ρƒ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² ΠΏΠΎΠ΄ iOS ΠΈ Mac OS X.
___________________________________________________________________

UPD.: РСальноС ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅

НСкоторыС ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ высказали Π½Π΅Π΄ΠΎΠ²ΠΎΠ»ΡŒΡΡ‚Π²ΠΎ ΠΈΠ·-Π·Π° отсутствия ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² ΠΈΠ· Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΉ ΠΆΠΈΠ·Π½ΠΈ. Π‘ΡƒΠΊΠ²Π°Π»ΡŒΠ½ΠΎ Π²Ρ‡Π΅Ρ€Π° натолкнулся Π½Π° Π·Π°Π΄Π°Ρ‡Ρƒ, которая ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ элСгантно Ρ€Π΅ΡˆΠ΅Π½Π° с использованиСм ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΈΡ… Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠΉ.

Если Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ с ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠΌ, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΄Π²ΠΎΠΈΡ‡Π½ΡƒΡŽ ΠΊΡƒΡ‡Ρƒ (binary heap). Как извСстно, это ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΊΠ°ΠΊ MinHeap, Ρ‚Π°ΠΊ ΠΈ MaxHeap, Ρ‚.Π΅. ΠΊΡƒΡ‡ΠΈ, Π³Π΄Π΅ Π² ΠΊΠΎΡ€Π½Π΅ Π΄Π΅Ρ€Π΅Π²Π° находится ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΈΠ»ΠΈ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ элСмСнт соотвСствСнно. Базовая рСализация MinHeap ΠΎΡ‚ MaxHeap Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚Π»ΠΈΡ‡Π°Ρ‚ΡŒΡΡ ΠΏΠΎ сути Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΎΡ‡Π½Ρ‹ΠΌΠΈ сравнСниями ΠΏΡ€ΠΈ восстановлСнии ΠΈΠ½Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π° Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠΉ ΠΊΡƒΡ‡ΠΈ послС добавлСния/удалСния элСмСнта.

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ класс BinaryHeap, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ свойство comparison Ρ‚ΠΈΠΏΠ° (T, T) -> Bool. А конструктор этого класса Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ способ сравнСния ΠΈ Π·Π°Ρ‚Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ Π² ΠΌΠ΅Ρ‚ΠΎΠ΄Π°Ρ… heapify. ΠŸΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса выглядСл Π±Ρ‹ Ρ‚Π°ΠΊ:

class BinaryHeap<T: Comparable>: DebugPrintable {
    private var array: Array<T?>
    private var comparison: (T, T) -> Bool
    private var used: Int = 0

   // Π‘Π»Π°-Π±Π»Π°-Π±Π»Π°

    // Internal Methods
    internal func removeTop() -> T? { //... }
    internal func getTop() -> T? { //... }
    
    // Public Methods:
    func addValue(value: T) {
        if used == self.array.count {
            self.grow()
        }
        
        self.array[used] = value
        heapifyToTop(used, comparison) // Одно ΠΈΠ· мСст, Π³Π΄Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ функция сравнСния
        self.used++
    }

    init(size newSize: Int, comparison newComparison: (T, T) -> Bool) {
        array = [T?](count: newSize, repeatedValue: nil)
        comparison = newComparison
    }
}

Π’Π΅ΠΏΠ΅Ρ€ΡŒ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ классы MinHeap ΠΈ MaxHeap Π½Π°ΠΌ достаточно ΡƒΠ½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΎΡ‚ BinaryHeap, Π° Π² ΠΈΡ… конструкторах просто явно ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊΠΎΠ΅ сравнСниС ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ. Π’ΠΎΡ‚ Ρ‚Π°ΠΊ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ наши классы:
class MaxHeap<T: Comparable>: BinaryHeap<T> {
    func getMax() -> T? {
        return self.getTop()
    }
    
    func removeMax() -> T? {
        return self.removeTop()
    }
    
    init(size newSize: Int) {
        super.init(size: newSize, {$0 > $1})
    }
}
class MinHeap<T: Comparable>: BinaryHeap<T> {
    func getMin() -> T? {
        return self.getTop()
    }
    
    func removeMin() -> T? {
        return self.removeTop()
    }
    
    init(size newSize: Int) {
        super.init(size: newSize, {$0 <= $1})
    }
}

Swift | Замыкания

Замыкания

ПослСднСС обновлСниС: 01.01.2018

Замыкания (сlosures) ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ самодостаточныС Π±Π»ΠΎΠΊΠΈ ΠΊΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΌΠ½ΠΎΠ³ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎ Π² Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… частях ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Π² Ρ‚ΠΎΠΌ числС Π² Π²ΠΈΠ΄Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Π² функциях.

По сути Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΡΠ²Π»ΡΡŽΡ‚ΡΡ частным случаСм Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠΉ. Замыкания ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΎΠ΄Π½Ρƒ ΠΈΠ· Ρ‚Ρ€Π΅Ρ… Ρ„ΠΎΡ€ΠΌ:

  • Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ имя ΠΈ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ ΡΠΎΡ…Ρ€Π°Π½ΡΡŽΡ‚ значСния Π²Π½Π΅ΡˆΠ½ΠΈΡ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΈ констант

  • Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ имя ΠΈ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΠΎΡ…Ρ€Π°Π½ΡΡŽΡ‚ значСния Π²Π½Π΅ΡˆΠ½ΠΈΡ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΈ констант

  • Π·Π°ΠΌΡ‹ΠΊΠ°ΡŽΡ‰ΠΈΠ΅ выраТСния (closure expressions), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ ΠΈΠΌΠ΅Π½ΠΈ ΠΈ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒ значСния Π²Π½Π΅ΡˆΠ½ΠΈΡ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΈ констант

Π’ ΠΏΡ€ΠΎΡˆΠ»Ρ‹Ρ… Ρ‚Π΅ΠΌΠ°Ρ… Π±Ρ‹Π»ΠΈ рассмотрСны Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΈ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, поэтому Π² Π΄Π°Π½Π½ΠΎΠΉ Ρ‚Π΅ΠΌΠ΅ рассмотрим Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π·Π°ΠΌΡ‹ΠΊΠ°ΡŽΡ‰ΠΈΠ΅ выраТСния.

Π—Π°ΠΌΡ‹ΠΊΠ°ΡŽΡ‰ΠΈΠ΅ выраТСния Π² ΠΎΠ±Ρ‰Π΅ΠΌ случаС ΠΈΠΌΠ΅ΡŽΡ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ синтаксис:


{ (ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹) -> Ρ‚ΠΈΠΏ_Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ_значСния in

    инструкции
}

Если замыкания Π½Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΈΠ»ΠΈ Π½Π΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ значСния, Ρ‚ΠΎ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ элСмСнты ΠΏΡ€ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ замыкания ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΠΏΡƒΡΠΊΠ°Ρ‚ΡŒΡΡ.

Подобно Ρ‚ΠΎΠΌΡƒ, ΠΊΠ°ΠΊ пСрСмСнная ΠΈΠ»ΠΈ константа ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ ссылку Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, ΠΎΠ½ΠΈ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ ссылку Π½Π° Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅:


let hello = { print("Hello world")}
hello()
hello()

Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС константС hello присваиваСтся анонимная функция, которая состоит ΠΈΠ· Π±Π»ΠΎΠΊΠ° ΠΊΠΎΠ΄Π°, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ дСйствия. Π­Ρ‚Π° функция Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ ΠΈΠΌΠ΅Π½ΠΈ, ΠΌΡ‹ Π΅Π΅ ΠΌΠΎΠΆΠ΅ΠΌ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Π΅Ρ€Π΅Π· константу hello.

ЀактичСски константа hello Π² Π΄Π°Π½Π½ΠΎΠΌ случаС ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ ()->() ΠΈΠ»ΠΈ ()-gt;Void:

let hello: ()->Void = { print("Hello world")}

Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ список ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ слова in:


let hello = {
    (message: String) in
    print(message)
}
hello("Hello")
hello("Salut")
hello("Ni hao")

Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΎΠ΄ΠΈΠ½ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ — message, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ прСдставляСт Ρ‚ΠΈΠΏ String. Бписок ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² указываСтся Π΄ΠΎ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ слова in, Π° послС ΠΈΠ΄ΡƒΡ‚ инструкции Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

Π’Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅:


let sum = {
    (x: Int, y: Int) -> Int in
    return x + y
}
print(sum(2, 5))        // 7
print(sum(12, 15))      // 27
print(sum(5, 3))        // 8

Замыкания ΠΊΠ°ΠΊ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ

Как ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, Π°Π½ΠΎΠ½ΠΈΠΌΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π² Ρ‚ΠΎΠΌ мСстС, Π³Π΄Π΅ ΠΎΠ½ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹. НСрСдко Π°Π½ΠΎΠ½ΠΈΠΌΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ Π² Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°, Ссли ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ прСдставляСт Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ:


func operation(_ a: Int, _ b: Int, _ action: (Int, Int) -> Int) -> Int{
    
    return action(a, b)
}

let x = 10
let y = 12

let result1 = operation(x, y, {(a: Int, b: Int) -> Int in
    
    return a + b
})

print(result1)    // 22

var result2 = operation(x, y, {(a: Int, b: Int) -> Int in return a - b})

print(result2)    // -2

Π—Π΄Π΅ΡΡŒ функция operation() Π² качСствС Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅Π³ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π΄Ρ€ΡƒΠ³ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ значСния ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ ΠΈ Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ². Но Π½Π°ΠΌ Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π² operation ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Π·Π°ΠΌΡ‹ΠΊΠ°ΡŽΡ‰Π΅Π΅ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅.

Π’ ΠΏΠ΅Ρ€Π²ΠΎΠΌ случаС это Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ слоТСниС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ², Π° Π²ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ случаС — ΠΈΡ… Π²Ρ‹Ρ‡ΠΈΡ‚Π°Π½ΠΈΠ΅.

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π·Π°ΠΌΡ‹ΠΊΠ°ΡŽΡ‰ΠΈΠ΅ выраТСния ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ Π½Π°ΠΌ ΡΠΎΠΊΡ€Π°Ρ‚ΠΈΡ‚ΡŒ объСм ΠΊΠΎΠ΄Π°, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π½Π΅ Π½Π°Π΄ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π΅Π΅ Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°. Но ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΎΠΊΡ€Π°Ρ‚ΠΈΡ‚ΡŒ ΠΊΠΎΠ΄ Π΅Ρ‰Π΅ большС. БистСма ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒ Ρ‚ΠΈΠΏ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΈ Ρ‚ΠΈΠΏ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ значСния, поэтому ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ этих Ρ‚ΠΈΠΏΠΎΠ² ΠΎΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ:


let x = 10
let y = 12

let result1 = operation(x, y, {(a, b) in a + b })
print(result1)    // 22

let result2 = operation(x, y, {(a, b) in a - b })
print(result2)    // -2

ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ Π²ΠΈΠ΄ΠΈΡ‚, Π·Π°ΠΌΡ‹ΠΊΠ°ΡŽΡ‰Π΅Π΅ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ пСрСдаСтся Π² качСствС значСния для ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Ρ‚ΠΈΠΏΠ° (Int, Int) -> Int, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Π² качСствС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, которая ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Ρ‚ΠΈΠΏΠ° Int. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΌΠΎΠΆΠ½ΠΎ Π½Π΅ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Ρ‚ΠΈΠΏ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² a ΠΈ b. Π’Π°ΠΊΠΆΠ΅ компилятор опрСдСляСт, Ρ‡Ρ‚ΠΎ функция Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° Int, поэтому Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ послС ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ слова in воспринимаСтся ΠΊΠ°ΠΊ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΈ явным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ return.

Но ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π΅Ρ‰Π΅ большС ΡΠΎΠΊΡ€Π°Ρ‚ΠΈΡ‚ΡŒ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ сокращСния для ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ²:


let x = 10
let y = 12

let result1 = operation(x, y, {$0 + $1})
print(result1)    // 22

let result2 = operation(x, y, {$0 - $1})
print(result2)    // -2

$0 прСдставляСт ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹ΠΉ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€, Π° $1 — Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€. БистСма автоматичСски распознаСт ΠΈΡ… ΠΈ ΠΏΠΎΠΉΠΌΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ числа.

Однако ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ здСсь Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Π½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ — слоТСниС ΠΈ Π²Ρ‹Ρ‡ΠΈΡ‚Π°Π½ΠΈΠ΅ Π΄Π²ΡƒΡ… чисСл, Ρ‚ΠΎ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΎΠΊΡ€Π°Ρ‚ΠΈΡ‚ΡŒ замыкания Π΅Ρ‰Π΅ большС:


let x = 10
let y = 12

let result1 = operation(x, y, +)
print(result1)    // 22

let result2 = operation(x, y, -)
print(result2)    // -2

БистСма автоматичСски распознаСт,Ρ‡Ρ‚ΠΎ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ слоТСния ΠΈ вычитания Π΄Π²ΡƒΡ… ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ², ΠΈ поэтому Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π±ΡƒΠ΄Π΅Ρ‚ Ρ‚ΠΎΡ‚ ΠΆΠ΅.

Доступ ΠΊ контСксту

Замыкания ΠΈΠΌΠ΅ΡŽΡ‚ ΠΏΠΎΠ»Π½Ρ‹ΠΉ доступ ΠΊ контСксту, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΎΠ½ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, замыкания ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ внСшниС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΈ константы ΠΊΠ°ΠΊ состояниС, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒΡΡ Π½Π° всСм протяТСнии ΠΆΠΈΠ·Π½ΠΈ замыкания:


func action() -> (()->Int){
    
    var val = 0
    return {
        val = val+1
        return val
    }
}
let inc = action()
print(inc())	// 1
print(inc())	// 2

Π—Π΄Π΅ΡΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° функция action, которая, Π² свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ, сама Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ. По Ρ„Π°ΠΊΡ‚Ρƒ ΠΎΠ½Π° Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π°ΠΌΡ‹ΠΊΠ°ΡŽΡ‰Π΅Π΅ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ внСшнюю ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ val Π½Π° Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ ΠΈ Π·Π°Ρ‚Π΅ΠΌ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Но ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ ΠΌΡ‹ Π²ΠΈΠ΄ΠΈΠΌ, Ρ‡Ρ‚ΠΎ пСрСмСнная val сохраняСт своС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ послС увСличСния, ΠΎΠ½ΠΎ Π½Π΅ сбрасываСтся ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ ΠΊ Π½ΡƒΠ»ΡŽ ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π’ΠΎ Π΅ΡΡ‚ΡŒ пСрСмСнная val прСдставляСт состояниС, Π³Π΄Π΅ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅.

Π—Π°Ρ…Π²Π°Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ

Π—Π°ΠΌΡ‹ΠΊΠ°ΡŽΡ‰ΠΈΠ΅ выраТСния ΠΎΠ±Π»Π°Π΄Π°ΡŽΡ‚ ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡ‚ΡŒΡŽ ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒ Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹Π΅ значСния ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹Ρ… Π² Π½ΠΈΡ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…. НапримСр, рассмотрим ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ:


var a = 14
var b = 2

let myClosure: () -> Int = {return a + b}
print(myClosure())  // 16

a = 5
b = 6
print(myClosure())  // 11

Π—Π°ΠΌΡ‹ΠΊΠ°ΡŽΡ‰Π΅Π΅ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ константа myClosure, складываСт значСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… a ΠΈ b. Π‘ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Ρ‚Π°ΠΊΠΆΠ΅ мСняСтся Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ замыкания myClosure. Однако ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π·Π°Ρ„ΠΈΠΊΡΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹Π΅ значСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…:


var a = 14
var b = 2

let myClosure: () -> Int = {[a, b] in return a + b}
print(myClosure())  // 16

a = 5
b = 6
print(myClosure())  // 16

ΠŸΠ΅Ρ€Π΅Π΄Π°Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Π² ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π½Ρ‹Π΅ скобки: [a, b], ΠΌΡ‹ Ρ‚Π΅ΠΌ самым фиксируСм ΠΈΡ… Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹Π΅ значСния. И Π΄Π°ΠΆΠ΅ Ссли значСния этих ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Π² ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ‚ измСнятся, Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΏΠ΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€Π΅ΠΆΠ½ΠΈΠΌΠΈ значСниями.

Swift — Замыкания

Π£Π²Π°ΠΆΠ°Π΅ΠΌΡ‹ΠΉ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ! Π Π΅ΠΊΠ»Π°ΠΌΠ° ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ ΠΈ Ρ€Π°Π·Π²ΠΈΠ²Π°Ρ‚ΡŒ наш ΠΏΡ€ΠΎΠ΅ΠΊΡ‚, дСлая Π΅Π³ΠΎ простым ΠΈ ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΌ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ для Вас. Если ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ интСрСсный ΠΈ Π²Π°ΠΆΠ½Ρ‹ΠΉ для Вас, Ρ‚ΠΎ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ Π½Π° Π½Π΅ΠΌ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊ Ρ€Π΅ΠΊΠ»Π°ΠΌΡ‹. Бпасибо, Ρ‡Ρ‚ΠΎ Ρ‡ΠΈΡ‚Π°Π΅Ρ‚Π΅ сайт!

Замыкания — это Π°Π²Ρ‚ΠΎΠ½ΠΎΠΌΠ½Ρ‹Π΅ Π±Π»ΠΎΠΊΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² вашСм ΠΊΠΎΠ΄Π΅. Замыкания Π² Swift ΠΏΠΎΡ…ΠΎΠΆΠΈ Π½Π° Π±Π»ΠΎΠΊΠΈ Π² C ΠΈ Objective-C ΠΈ Π½Π° лямбды Π² Π΄Ρ€ΡƒΠ³ΠΈΡ… языках программирования.

Замыкания ΠΌΠΎΠ³ΡƒΡ‚ Π·Π°Ρ…Π²Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΈ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ссылки Π½Π° Π»ΡŽΠ±Ρ‹Π΅ константы ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΈΠ· контСкста, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΎΠ½ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹.Β Π­Ρ‚ΠΎ называСтся закрытиСм этих констант ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ….Β Swift ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ всС ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ Π·Π°Ρ…Π²Π°Ρ‚Π° для вас.

Π—ΠΠœΠ•Π’ΠšΠ

НС Π±Π΅ΡΠΏΠΎΠΊΠΎΠΉΡ‚Π΅ΡΡŒ, Ссли Π²Ρ‹ Π½Π΅ Π·Π½Π°ΠΊΠΎΠΌΡ‹ с ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠ΅ΠΉ Π·Π°Ρ…Π²Π°Ρ‚Π°.Β Π­Ρ‚ΠΎ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ ΠΎΠ±ΡŠΡΡΠ½ΡΠ΅Ρ‚ΡΡ Π½ΠΈΠΆΠ΅ Π²Β Ρ€Π°Π·Π΄Π΅Π»Π΅ Β«Π—Π°Ρ…Π²Π°Ρ‚ цСнностСй» .

Π“Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΈ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, прСдставлСнныС в функциях , Π½Π° самом Π΄Π΅Π»Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ частными случаями Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠΉ. Замыкания ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ ΠΎΠ΄Π½Ρƒ ΠΈΠ· Ρ‚Ρ€Π΅Ρ… Ρ„ΠΎΡ€ΠΌ:

  • Π“Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ — это замыкания, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ имя ΠΈ Π½Π΅ Π·Π°Ρ…Π²Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ.
  • Π’Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ — это замыкания, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ имя ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π·Π°Ρ…Π²Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ значСния ΠΈΠ· своСй Π²ΠΌΠ΅Ρ‰Π°ΡŽΡ‰Π΅ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.
  • ВыраТСния Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠΉ — это бСзымянныС замыкания, написанныС Π² ΡƒΠΏΡ€ΠΎΡ‰Π΅Π½Π½ΠΎΠΌ синтаксисС, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π·Π°Ρ…Π²Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ значСния ΠΈΠ· ΠΎΠΊΡ€ΡƒΠΆΠ°ΡŽΡ‰Π΅Π³ΠΎ контСкста.

ВыраТСния замыкания Swift ΠΈΠΌΠ΅ΡŽΡ‚ чистый, понятный ΡΡ‚ΠΈΠ»ΡŒ с оптимизациями, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΠΏΠΎΡΠΎΠ±ΡΡ‚Π²ΡƒΡŽΡ‚ ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΎΠΌΡƒ синтаксису Π±Π΅Π· ΠΏΠΎΠΌΠ΅Ρ… Π² ΠΎΠ±Ρ‰ΠΈΡ… сцСнариях.Β Π­Ρ‚ΠΈ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ Π² сСбя:

  • Π’Ρ‹Π²ΠΎΠ΄ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΈ Ρ‚ΠΈΠΏΠΎΠ² Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΈΠ· контСкста
  • НСявныС Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Ρ‹ ΠΎΡ‚ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠΉ с ΠΎΠ΄Π½ΠΈΠΌ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ
  • Π‘ΠΎΠΊΡ€Π°Ρ‰Π΅Π½Π½Ρ‹Π΅ ΠΈΠΌΠ΅Π½Π° Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ²
  • Бинтаксис Π·Π°ΠΌΡ‹ΠΊΠ°ΡŽΡ‰Π΅Π³ΠΎ замыкания

Π—Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ

Π’Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, прСдставлСнныС Π²Β Nested FunctionsΒ , ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΌ срСдством присвоСния ΠΈΠΌΠ΅Π½ ΠΈ опрСдСлСния Π°Π²Ρ‚ΠΎΠ½ΠΎΠΌΠ½Ρ‹Ρ… Π±Π»ΠΎΠΊΠΎΠ² ΠΊΠΎΠ΄Π° ΠΊΠ°ΠΊ части Π±ΠΎΠ»Π΅Π΅ ΠΊΡ€ΡƒΠΏΠ½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Однако ΠΈΠ½ΠΎΠ³Π΄Π° ΠΏΠΎΠ»Π΅Π·Π½ΠΎ ΠΏΠΈΡΠ°Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΈΠ΅ вСрсии Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎ-ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Ρ… конструкций Π±Π΅Π· ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ объявлСния ΠΈ ΠΈΠΌΠ΅Π½ΠΈ.Β Π­Ρ‚ΠΎ особСнно Π²Π΅Ρ€Π½ΠΎ, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚Π΅ с функциями ΠΈΠ»ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² качСствС ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ»ΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… своих Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ².

Π—Π°ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰ΠΈΠ΅ выраТСния — это способ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ встроСнныС замыкания Π² ΠΊΡ€Π°Ρ‚ΠΊΠΎΠΌ, сфокусированном синтаксисС. ВыраТСния замыкания ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‚ нСсколько ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΉ синтаксиса для написания Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠΉ Π² сокращСнной Ρ„ΠΎΡ€ΠΌΠ΅ Π±Π΅Π· ΠΏΠΎΡ‚Π΅Ρ€ΠΈ ясности ΠΈΠ»ΠΈ намСрСния.Β ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Π΅ Π½ΠΈΠΆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠΉ ΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΡŽΡ‚ эти ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ, уточняя ΠΎΠ΄ΠΈΠ½ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Β sorted(by:)ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Π² Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΉ, каТдая ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π²Ρ‹Ρ€Π°ΠΆΠ°Π΅Ρ‚ Ρ‚Ρƒ ΠΆΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ ΠΊΡ€Π°Ρ‚ΠΊΠΈΠΌ способом.

Π‘ΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄

Бтандартная Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Swift прСдоставляСт ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΏΠΎΠ΄ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌΒ sorted(by:), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ сортируСт массив Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ извСстного Ρ‚ΠΈΠΏΠ° Π½Π° основС Π²Ρ‹Π²ΠΎΠ΄Π° прСдоставлСнного Π²Π°ΠΌΠΈ закрытия сортировки. ПослС Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ процСсса сортировки sorted(by:)ΠΌΠ΅Ρ‚ΠΎΠ΄ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π½ΠΎΠ²Ρ‹ΠΉ массив Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ Ρ‚ΠΈΠΏΠ° ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€Π°, Ρ‡Ρ‚ΠΎ ΠΈ старый, с элСмСнтами Π² ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΌ порядкС сортировки.Β Π˜ΡΡ…ΠΎΠ΄Π½Ρ‹ΠΉ массив Π½Π΅ измСняСтся sorted(by:)ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ.

ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Π΅ Π½ΠΈΠΆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ замыкания ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚Β sorted(by:)ΠΌΠ΅Ρ‚ΠΎΠ΄ для сортировки массива StringΠ·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π² ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΌ Π°Π»Ρ„Π°Π²ΠΈΡ‚Π½ΠΎΠΌ порядкС.Β Π’ΠΎΡ‚ Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹ΠΉ массив для сортировки:

let names = ["Chris", "Alex", "Ewa", "Barry", "Daniella"]

sorted(by:)ΠœΠ΅Ρ‚ΠΎΠ΄ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ ,Β ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π΄Π²Π° Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΒ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ Ρ‚ΠΈΠΏΠ°, Ρ‡Ρ‚ΠΎ и содСрТимоС массива ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚Β BoolΠ·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ ,Β Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π»ΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅Π΄ ΠΈΠ»ΠΈ послС Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ значСния ΠΊΠ°ΠΊ значСния ΡΠΎΡ€Ρ‚ΠΈΡ€ΡƒΡŽΡ‚ΡΡ.Β Π—Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ сортировки Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ,Β trueСсли ΠΏΠ΅Ρ€Π²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΡΡ‚ΠΎΡΡ‚ΡŒΒ ΠΏΠ΅Ρ€Π΅Π΄Β Π²Ρ‚ΠΎΡ€Ρ‹ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ, ΠΈ Π²Β falseΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС.

Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ сортируСтся массив StringΠ·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, поэтому Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ сортировки Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ Ρ‚ΠΈΠΏΠ°Β .(String,Β String)Β ->Β Bool

Один ΠΈΠ· способов ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ сортировки — Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Π΅Π΅ Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°Β sorted(by:)ΠΌΠ΅Ρ‚ΠΎΠ΄Ρƒ:

func backward(_ s1: String, _ s2: String) -> Bool {

return s1 > s2

}

var reversedNames = names.sorted(by: backward)

// reversedNames is equal to ["Ewa", "Daniella", "Chris", "Barry", "Alex"]

Если пСрвая строка (Β s1) большС, Ρ‡Π΅ΠΌ вторая строка (Β s2),Β backward(_:_:)функция вСрнСтся true, указывая, Ρ‡Ρ‚ΠΎΒ s1Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Ρ€Π°Π½ΡŒΡˆΠ΅Β s2Π² отсортированном массивС. Для символов Π² строках «большС Ρ‡Π΅ΠΌΒ» ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ «появляСтся ΠΏΠΎΠ·ΠΆΠ΅ Π² Π°Π»Ρ„Π°Π²ΠΈΡ‚Π΅, Ρ‡Π΅ΠΌΒ».Β Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π±ΡƒΠΊΠ²Π°Β "B"«большС, Ρ‡Π΅ΠΌΒ» Π±ΡƒΠΊΠ²Π°Β "A", Π° строка "Tom"большС, Ρ‡Π΅ΠΌ строка "Tim".Β Π­Ρ‚ΠΎ Π΄Π°Π΅Ρ‚ ΠΎΠ±Ρ€Π°Ρ‚Π½Ρ‹ΠΉ Π°Π»Ρ„Π°Π²ΠΈΡ‚Π½Ρ‹ΠΉ Π²ΠΈΠ΄ с "Barry"Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ΠΌ Π΄ΠΎΒ "Alex"ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅.

Однако это довольно многословный способ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΠΎ сути являСтся Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ с ΠΎΠ΄Π½ΠΈΠΌ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ (Β ).Β Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Ρ‚ΠΈΡ‚Π΅Π»ΡŒΠ½Π΅Π΅ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ сортировки встроСнным, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ синтаксис выраТСния закрытия.aΒ >Β b

Бинтаксис выраТСния закрытия

Бинтаксис выраТСния замыкания ΠΈΠΌΠ΅Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΠΎΠ±Ρ‰ΡƒΡŽ Ρ„ΠΎΡ€ΠΌΡƒ:

{ (parameters) -> return type in

statements

}

Π’Β ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹Β Π² синтаксисС выраТСния закрытия ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π²-ΠΈΠ· ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ², Π½ΠΎ ΠΎΠ½ΠΈ Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ значСния ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ.Β ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Variadic ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ, Ссли Π²Ρ‹ ΡƒΠΊΠ°ΠΆΠ΅Ρ‚Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Variadic.Β ΠšΠΎΡ€Ρ‚Π΅ΠΆΠΈ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² качСствС Ρ‚ΠΈΠΏΠΎΠ² ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΈ Ρ‚ΠΈΠΏΠΎΠ² Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ….

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π½ΠΈΠΆΠ΅ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π²Π΅Ρ€ΡΠΈΡŽ выраТСния замыкания backward(_:_:)Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ свСрху:

reversedNames = names.sorted(by: { (s1: String, s2: String) -> Bool in

return s1 > s2

})

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ объявлСниС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° для этого встроСнного замыкания ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½ΠΎ объявлСнию ΠΈΠ·Β backward(_:_:)Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.Β Π’ ΠΎΠ±ΠΎΠΈΡ… случаях это написано ΠΊΠ°ΠΊΒ . Однако для встроСнного выраТСния замыкания ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹ΠΉ Ρ‚ΠΈΠΏ Π·Π°ΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ΡΡΒ Π²Π½ΡƒΡ‚Ρ€ΠΈΒ Ρ„ΠΈΠ³ΡƒΡ€Π½Ρ‹Ρ… скобок, Π° Π½Π΅ Π²Π½Π΅ ΠΈΡ….(s1:Β String,Β s2:Β String)Β ->Β Bool

Начало Ρ‚Π΅Π»Π° замыкания вводится ΠΏΠΎΒ inΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠΌΡƒ слову.Β Π­Ρ‚ΠΎ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΈ Ρ‚ΠΈΠΏΠ° Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° замыкания Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΎ, ΠΈ Ρ‚Π΅Π»ΠΎ замыкания Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π½Π°Ρ‡Π°Ρ‚ΡŒΡΡ.

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρ‚Π΅Π»ΠΎ замыкания ΠΎΡ‡Π΅Π½ΡŒ ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΎΠ΅, Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π² ΠΎΠ΄Π½Ρƒ строку:

reversedNames = names.sorted(by: { (s1: String, s2: String) -> Bool in return s1 > s2 } )

Π­Ρ‚ΠΎ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΎΠ±Ρ‰ΠΈΠΉ Π²Ρ‹Π·ΠΎΠ²Β sorted(by:)ΠΌΠ΅Ρ‚ΠΎΠ΄Π° остался ΠΏΡ€Π΅ΠΆΠ½ΠΈΠΌ.Β ΠŸΠ°Ρ€Π° скобок ΠΏΠΎ-ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ пСрСносит вСсь Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°. Однако этот Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ являСтся Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΌ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ΠΌ.

Π’Ρ‹Π²ΠΎΠ΄ Ρ‚ΠΈΠΏΠ° ΠΈΠ· контСкста

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ сортировки пСрСдаСтся ΠΌΠ΅Ρ‚ΠΎΠ΄Ρƒ Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°, Swift ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ‚ΠΈΠΏΡ‹ Π΅Π³ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΈ Ρ‚ΠΈΠΏ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ значСния.Β sorted(by:)ΠœΠ΅Ρ‚ΠΎΠ΄ вызываСтся Π½Π° массив строк, поэтому Π΅Π³ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ Ρ‚ΠΈΠΏΠ°Β .Β Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ,Β Ρ‡Ρ‚ΠΎΒ ΠΈΒ Ρ‚ΠΈΠΏΠ°ΠΌ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ написано ΠΊΠ°ΠΊ Ρ‡Π°ΡΡ‚ΡŒ опрСдСлСния ВыраТСния Π·Π°ΠΊΡƒΠΏΠΎΡ€ΠΈΠ²Π°ΡŽΡ‰Π΅Π³ΠΎ.Β ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ всС Ρ‚ΠΈΠΏΡ‹ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹Π²Π΅Π΄Π΅Π½Ρ‹, стрСлка Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° (Β ) ΠΈ ΠΊΡ€ΡƒΠ³Π»Ρ‹Π΅ скобки Π²ΠΎΠΊΡ€ΡƒΠ³ ΠΈΠΌΠ΅Π½ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠΏΡƒΡ‰Π΅Π½Ρ‹:(String,Β String)Β ->Β Bool(String,Β String)Bool->

reversedNames = names.sorted(by: { s1, s2 in return s1 > s2 } )

ВсСгда ΠΌΠΎΠΆΠ½ΠΎ вывСсти Ρ‚ΠΈΠΏΡ‹ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹ΠΉ Ρ‚ΠΈΠΏ ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ замыкания Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΈΠ»ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ Π² Π²ΠΈΠ΄Π΅ встроСнного выраТСния замыкания.Β Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Π²Π°ΠΌ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΈΡΠ°Ρ‚ΡŒ встроСнноС Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ Π² Π΅Π³ΠΎ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ»Π½ΠΎΠΉ Ρ„ΠΎΡ€ΠΌΠ΅, ΠΊΠΎΠ³Π΄Π° Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠ»ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°.

Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, Π²Ρ‹ всС Ρ€Π°Π²Π½ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‚ΠΈΠΏΡ‹ явными, Ссли Ρ…ΠΎΡ‚ΠΈΡ‚Π΅, ΠΈ это рСкомСндуСтся, Ссли это позволяСт ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ двусмыслСнности для Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π»Π΅ΠΉ вашСго ΠΊΠΎΠ΄Π°.Β Π’ случаС sorted(by:)ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Ρ†Π΅Π»ΡŒ закрытия ясна ΠΈΠ· Ρ„Π°ΠΊΡ‚Π°, Ρ‡Ρ‚ΠΎ сортировка ΠΈΠΌΠ΅Π΅Ρ‚ мСсто, ΠΈ для читатСля бСзопасно ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅, вСроятно, Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ со StringзначСниями, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ это ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ с сортировкой ΠΈΠ· массива строк.

НСявныС Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Ρ‹ ΠΈΠ· Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠΉ с ΠΎΠ΄Π½ΠΈΠΌ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ

Замыкания с ΠΎΠ΄Π½ΠΈΠΌ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ ΠΌΠΎΠ³ΡƒΡ‚ нСявно Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΈΡ… СдинствСнного выраТСния, опуская returnΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово ΠΈΠ· ΠΈΡ… объявлСния, ΠΊΠ°ΠΊ Π² этой вСрсии ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°:

reversedNames = names.sorted(by: { s1, s2 in s1 > s2 } )

Π—Π΄Π΅ΡΡŒ Ρ‚ΠΈΠΏ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈΒ sorted(by:)Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° ΠΌΠ΅Ρ‚ΠΎΠ΄Π° проясняСт, Ρ‡Ρ‚ΠΎΒ BoolΠ·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½ΠΎ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ΠΌ.Β ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρ‚Π΅Π»ΠΎ замыкания содСрТит СдинствСнноС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ (Β ), ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚Β Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, двусмыслСнности Π½Π΅Ρ‚, ΠΈΒ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠΏΡƒΡ‰Π΅Π½ΠΎ.s1Β >Β s2Boolreturn

Π‘ΠΎΠΊΡ€Π°Ρ‰Π΅Π½Π½Ρ‹Π΅ ΠΈΠΌΠ΅Π½Π° Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ²

Swift автоматичСски прСдоставляСт сокращСнныС ΠΈΠΌΠ΅Π½Π° Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² Π²ΡΡ‚Ρ€Π°ΠΈΠ²Π°Ρ‚ΡŒ Π·Π°Ρ‚Π²ΠΎΡ€Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Ρ‹ для обозначСния Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² замыкания ΠΏΠΎ ΠΈΠΌΠ΅Π½Π°ΠΌΒ $0,Β $1,Β $2ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅.

Если Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ эти сокращСнныС ΠΈΠΌΠ΅Π½Π° Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² Π² своСм Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ замыкания, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ список Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² замыкания ΠΈΠ· Π΅Π³ΠΎ опрСдСлСния, Π° число ΠΈ Ρ‚ΠΈΠΏ сокращСнных ΠΈΠΌΠ΅Π½ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² Π±ΡƒΠ΄ΡƒΡ‚ Π²Ρ‹Π²Π΅Π΄Π΅Π½Ρ‹ ΠΈΠ· ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.Β inΠšΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠΏΡƒΡ‰Π΅Π½Π°, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΡƒΠΊΡƒΠΏΠΎΡ€ΠΎΡ‡Π½ΠΎΠ΅ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ состоит ΠΈΠ· Π΅Π³ΠΎ Ρ‚Π΅Π»Π°:

reversedNames = names.sorted(by: { $0 > $1 } )

Π—Π΄Π΅ΡΡŒΒ $0ΠΈΒ $1ΡΡΡ‹Π»Π°ΡŽΡ‚ΡΡ Π½Π° ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΠΈ Π²Ρ‚ΠΎΡ€ΠΎΠΉΒ StringаргумСнты замыкания .

ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΡΠΊΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹

На самом Π΄Π΅Π»Π΅ Π΅ΡΡ‚ΡŒ Π΅Ρ‰Π΅Β Π±ΠΎΠ»Π΅Π΅ короткий способ написания выраТСния замыкания Π²Ρ‹ΡˆΠ΅.Β StringΠ’ΠΈΠΏΒ Swift опрСдСляСт свою ΡΠΏΠ΅Ρ†ΠΈΡ„ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ для строки Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° more-than (Β >) ΠΊΠ°ΠΊ ΠΌΠ΅Ρ‚ΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΠΌΠ΅Π΅Ρ‚ Π΄Π²Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Ρ‚ΠΈΠΏΠ°Β StringΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ°Β Bool.Β Π­Ρ‚ΠΎ Ρ‚ΠΎΡ‡Π½ΠΎ соотвСтствуСт Ρ‚ΠΈΠΏΡƒ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠΌΡƒ для sorted(by:)ΠΌΠ΅Ρ‚ΠΎΠ΄Π°.Β Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ просто ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ «большС, Ρ‡Π΅ΠΌΒ», ΠΈ Swift ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ ΡΠΏΠ΅Ρ†ΠΈΡ„ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ для строки Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ:

reversedNames = names.sorted(by: >)

Для получСния Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° см.Β ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°Β .

Π—Π°ΠΌΡ‹ΠΊΠ°ΡŽΡ‰ΠΈΠ΅ Π·Π°Ρ‚Π²ΠΎΡ€Ρ‹

Если Π²Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ замыкания Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π² качСствС послСднСго Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π° Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ замыкания являСтся Π΄Π»ΠΈΠ½Π½Ρ‹ΠΌ, вмСсто этого ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π΅Π³ΠΎ Π² ΠΊΠ°Ρ‡Π΅ΡΡ‚Π²Π΅Β Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‰Π΅Π³ΠΎ замыкания .Β Π—Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‰Π΅Π΅ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ записываСтся послС ΠΊΡ€ΡƒΠ³Π»Ρ‹Ρ… скобок Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π΄Π°ΠΆΠ΅ Ссли ΠΎΠ½ΠΎ всС Π΅Ρ‰Π΅ являСтся Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Когда Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ ΠΊΠΎΠ½Π΅Ρ‡Π½Ρ‹ΠΉ синтаксис замыкания, Π²Ρ‹ Π½Π΅ ΠΏΠΈΡˆΠ΅Ρ‚Π΅ ΠΌΠ΅Ρ‚ΠΊΡƒ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° для замыкания ΠΊΠ°ΠΊ Ρ‡Π°ΡΡ‚ΡŒ Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

func someFunctionThatTakesAClosure(closure: () -> Void) {

// function body goes here

}



// Here's how you call this function without using a trailing closure:



someFunctionThatTakesAClosure(closure: {

// closure's body goes here

})



// Here's how you call this function with a trailing closure instead:



someFunctionThatTakesAClosure() {

// trailing closure's body goes here

}

Π—Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ с сортировкой строк ΠΈΠ· ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠ³ΠΎΒ Π²Ρ‹ΡˆΠ΅ раздСла Бинтаксис выраТСния закрытия моТСт Π±Ρ‹Ρ‚ΡŒ записано Π²Π½Π΅Β sorted(by:)скобок ΠΌΠ΅Ρ‚ΠΎΠ΄Π° ΠΊΠ°ΠΊ Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‰Π΅Π΅ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅:

reversedNames = names.sorted() { $0 > $1 }

Если Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ закрытия прСдоставляСтся Π² качСствС СдинствСнного Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠ»ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°, ΠΈ Π²Ρ‹ прСдоставляСтС это Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΊΠ°ΠΊ ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠ΅ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅, Π²Π°ΠΌ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΏΠ°Ρ€Ρƒ скобок ()послС ΠΈΠΌΠ΅Π½ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠ»ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:

reversedNames = names.sorted { $0 > $1 }

ΠšΠΎΠ½Π΅Ρ‡Π½Ρ‹Π΅ замыкания Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹, ΠΊΠΎΠ³Π΄Π° Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ достаточно Π΄Π»ΠΈΠ½Π½ΠΎΠ΅, ΠΈ Π΅Π³ΠΎ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π² ΠΎΠ΄Π½ΠΎΠΉ строкС. НапримСр, ΡƒΒ ArrayΡ‚ΠΈΠΏΠ°Β SwiftΒ Π΅ΡΡ‚ΡŒΒ map(_:)ΠΌΠ΅Ρ‚ΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ замыкания Π² качСствС СдинствСнного Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°.Β Π—Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ вызываСтся ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ элСмСнта Π² массивС ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½ΠΎΠ΅ сопоставлСнноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ (Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°) для этого элСмСнта.Β Π₯Π°Ρ€Π°ΠΊΡ‚Π΅Ρ€ сопоставлСния ΠΈ Ρ‚ΠΈΠΏ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ значСния оставляСтся Π½Π° усмотрСниС замыкания.

ПослС примСнСния прСдоставлСнного замыкания ΠΊ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ элСмСнту массива map(_:)ΠΌΠ΅Ρ‚ΠΎΠ΄ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π½ΠΎΠ²Ρ‹ΠΉ массив, содСрТащий всС Π½ΠΎΠ²Ρ‹Π΅ сопоставлСнныС значСния, Π² Ρ‚ΠΎΠΌ ΠΆΠ΅ порядкС, Ρ‡Ρ‚ΠΎ ΠΈ ΠΈΡ… ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ значСния Π² исходном массивС.

Π’ΠΎΡ‚ ΠΊΠ°ΠΊ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΒ map(_:)ΠΌΠ΅Ρ‚ΠΎΠ΄ с Π·Π°ΠΌΡ‹ΠΊΠ°ΡŽΡ‰ΠΈΠΌ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ΠΌ для прСобразования массива IntΠ·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π² массив StringΠ·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ.Β ΠœΠ°ΡΡΠΈΠ²Β ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для создания Π½ΠΎΠ²ΠΎΠ³ΠΎ массива :[16,Β 58,Β 510]["OneSix",Β "FiveEight",Β "FiveOneZero"]

let digitNames = [

0: "Zero", 1: "One", 2: "Two", 3: "Three", 4: "Four",

5: "Five", 6: "Six", 7: "Seven", 8: "Eight", 9: "Nine"

]

let numbers = [16, 58, 510]

ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ Π²Ρ‹ΡˆΠ΅ ΠΊΠΎΠ΄ создаСт ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ сопоставлСний ΠΌΠ΅ΠΆΠ΄Ρƒ цСлочислСнными Ρ†ΠΈΡ„Ρ€Π°ΠΌΠΈ ΠΈ англоязычными вСрсиями ΠΈΡ… ΠΈΠΌΠ΅Π½. Он Ρ‚Π°ΠΊΠΆΠ΅ опрСдСляСт массив Ρ†Π΅Π»Ρ‹Ρ… чисСл, Π³ΠΎΡ‚ΠΎΠ²Ρ‹ΠΉ для прСобразования Π² строки.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΒ numbersмассив для создания массива StringΠ·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, ΠΏΠ΅Ρ€Π΅Π΄Π°Π² Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ закрытия Π² ΠΌΠ΅Ρ‚ΠΎΠ΄ массива map(_:)Π² качСствС Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‰Π΅Π³ΠΎ замыкания:

let strings = numbers.map { (number) -> String in

var number = number

var output = ""

repeat {

output = digitNames[number % 10]! + output

number /= 10

} while number > 0

return output

}

// strings is inferred to be of type [String]

// its value is ["OneSix", "FiveEight", "FiveOneZero"]

map(_:)ΠœΠ΅Ρ‚ΠΎΠ΄ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π·Π°ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰Π΅Π³ΠΎ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ элСмСнта массива.Β Π’Π°ΠΌ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Ρ‚ΠΈΠΏ Π²Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° замыкания number, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Ρ‚ΠΈΠΏ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹Π²Π΅Π΄Π΅Π½ ΠΈΠ· Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π² массивС, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½ΡƒΠΆΠ½ΠΎ ΠΎΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΡ‚ΡŒ.

Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ пСрСмСнная numberинициализируСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° замыкания number, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ это Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π² Ρ‚Π΅Π»Π΅ замыкания.Β (ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠΉ всСгда ΡΠ²Π»ΡΡŽΡ‚ΡΡ константами.) Π’Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ замыкания Ρ‚Π°ΠΊΠΆΠ΅ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ‚ΠΈΠΏ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ значСния String, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Ρ‚ΠΈΠΏ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ сохранСн Π² ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½Π½ΠΎΠΌ Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠΌ массивС.

Π’Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ закрытия создаСт строку, Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΡƒΡŽΒ outputΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½Π° вызываСтся. Он вычисляСт послСднюю Ρ†ΠΈΡ„Ρ€ΡƒΒ number, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ остатка (Β ), ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ эту Ρ†ΠΈΡ„Ρ€Ρƒ для поиска ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ строки в словарС.Β Π—Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для создания строкового прСдставлСния любого Ρ†Π΅Π»ΠΎΠ³ΠΎ числа, большСго нуля.numberΒ %Β 10digitNames

Π—ΠΠœΠ•Π’ΠšΠ

Π—Π° Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌΒ digitNamesΠ½ΠΈΠΆΠ½Π΅Π³ΠΎ индСкса словаря слСдуСт Π²ΠΎΡΠΊΠ»ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Π·Π½Π°ΠΊ (Β !), ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π½ΠΈΠΆΠ½ΠΈΠ΅ индСксы словаря Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰Π΅Π΅, Ρ‡Ρ‚ΠΎ поиск Π² словарС ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒΡΡ Π½Π΅ΡƒΠ΄Π°Ρ‡Π½ΠΎ, Ссли ΠΊΠ»ΡŽΡ‡ Π½Π΅ сущСствуСт.Β Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π²Ρ‹ΡˆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ гарантируСтся, что для словаря всСгда Π±ΡƒΠ΄Π΅Ρ‚ допустимый ΠΊΠ»ΡŽΡ‡ индСкса , ΠΈ поэтому для ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ развСртывания значСния, хранящСгося Π² Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠΌ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΈ индСкса,Β ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π²ΠΎΡΠΊΠ»ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Π·Π½Π°ΠΊΒ .numberΒ %Β 10digitNamesString

Π‘Ρ‚Ρ€ΠΎΠΊΠ° извлСкаСтся ΠΈΠ·Β digitNamesсловаря добавляСтся в пСрСднСй части output, эффСктивно ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ ΡΡ‚Ρ€ΠΎΠΊΠΎΠ²ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ числа Π² ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΌ порядкС .Β (Π’Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅Β Π΄Π°Π΅Ρ‚ значСниС для , для и для .)numberΒ %Β 106168580510

numberΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ Π·Π°Ρ‚Π΅ΠΌ дСлится 10.Β ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ это Ρ†Π΅Π»ΠΎΠ΅ число, ΠΎΠ½ΠΎ округляСтся Π²ΠΎ врСмя дСлСния, поэтому 16становится 1,Β 58становится 5ΠΈΒ 510становится 51.

ΠŸΡ€ΠΎΡ†Π΅ΡΡ повторяСтся Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° ΠΎΠ½ Π½Π΅Β numberстанСт Ρ€Π°Π²Π½Ρ‹ΠΌΒ 0; Π² этот ΠΌΠΎΠΌΠ΅Π½Ρ‚Β outputстрока возвращаСтся Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ΠΌ ΠΈ добавляСтся Π² Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠΉ массив map(_:)ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ.

ИспользованиС синтаксиса ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠ³ΠΎ замыкания Π² ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π²Ρ‹ΡˆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π°ΠΊΠΊΡƒΡ€Π°Ρ‚Π½ΠΎ инкапсулируСт Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ замыкания сразу послС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚, Π±Π΅Π· нСобходимости Π·Π°ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ всС Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ Π²ΠΎΒ map(_:)внСшниС скобки ΠΌΠ΅Ρ‚ΠΎΠ΄Π°.

Π—Π°Ρ…Π²Π°Ρ‚ цСнностСй

Π—Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚Β Π·Π°Ρ…Π²Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒΒ ΠΊΠΎΠ½ΡΡ‚Π°Π½Ρ‚Ρ‹ ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΈΠ· ΠΎΠΊΡ€ΡƒΠΆΠ°ΡŽΡ‰Π΅Π³ΠΎ контСкста, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΎΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎ.Β Π—Π°Ρ‚Π΅ΠΌ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΡΡ‹Π»Π°Ρ‚ΡŒΡΡ ΠΈ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ значСния этих констант ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Π²Π½ΡƒΡ‚Ρ€ΠΈ своСго Ρ‚Π΅Π»Π°, Π΄Π°ΠΆΠ΅ Ссли исходная ΠΎΠ±Π»Π°ΡΡ‚ΡŒ, которая опрСдСляла константы ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, большС Π½Π΅ сущСствуСт.

Π’ Swift самой простой Ρ„ΠΎΡ€ΠΌΠΎΠΉ замыкания, которая ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Ρ…Π²Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ значСния, являСтся влоТСнная функция, записанная Π² Ρ‚Π΅Π»Π΅ Π΄Ρ€ΡƒΠ³ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. ВлоТСнная функция ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Ρ…Π²Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ Π»ΡŽΠ±Ρ‹Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ своСй внСшнСй Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ„ΠΈΠΊΡΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π»ΡŽΠ±Ρ‹Π΅ константы ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ Π²ΠΎ внСшнСй Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈΒ makeIncrementer, которая содСрТит Π²Π»ΠΎΠΆΠ΅Π½Π½ΡƒΡŽ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽΒ incrementer. ВлоТСнная incrementer()функция Π·Π°Ρ…Π²Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ Π΄Π²Π° значСния runningTotalΠΈΒ amountΠΈΠ· ΠΎΠΊΡ€ΡƒΠΆΠ°ΡŽΡ‰Π΅Π³ΠΎ контСкста. ПослС Π·Π°Ρ…Π²Π°Ρ‚Π° этих Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉΒ incrementerвозвращаСтся makeIncrementerΠΊΠ°ΠΊ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ увСличиваСтся runningTotalΠΏΡ€ΠΈΒ amountΠΊΠ°ΠΆΠ΄ΠΎΠΌ Π²Ρ‹Π·ΠΎΠ²Π΅.

func makeIncrementer(forIncrement amount: Int) -> () -> Int {

var runningTotal = 0

func incrementer() -> Int {

runningTotal += amount

return runningTotal

}

return incrementer

}

Π’ΠΈΠΏ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π°Β makeIncrementerisΒ .Β Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΎΠ½ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚Β Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽΒ , Π° Π½Π΅ простоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Ѐункция, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΎΠ½Π° Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚, Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚Β Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½Π° вызываСтся.Β Π§Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ·Π½Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, см.Β Π’ΠΈΠΏΡ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΊΠ°ΠΊ Π’ΠΈΠΏΡ‹ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π°Β .()Β ->Β IntInt

makeIncrementer(forIncrement:)Ѐункция опрСдСляСт Ρ†Π΅Π»ΠΎΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ΅Β runningTotal, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ сумму ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ΠΎΡ€ ,Β ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½Ρ‹.Β Π­Ρ‚Π° пСрСмСнная инициализируСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌΒ 0.

makeIncrementer(forIncrement:)Ѐункция ΠΈΠΌΠ΅Π΅Ρ‚ ΠΎΠ΄ΠΈΠ½Β IntΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ с Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ ΠΌΠ΅Ρ‚ΠΊΠΎΠΉΒ forIncrement, ΠΈ имя ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°Β amount.Β Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°, ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΠΎΠ΅ этому ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρƒ, ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, сколько runningTotalΠ½ΡƒΠΆΠ½ΠΎ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Π²Ρ‹Π·ΠΎΠ²Π΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚Π°.Β makeIncrementerЀункция опрСдСляСт Π²Π»ΠΎΠΆΠ΅Π½Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ с имСнСм incrementer, которая выполняСт фактичСскоС ΠΏΡ€ΠΈΡ€Π°Ρ‰Π΅Π½ΠΈΠ΅.Β Π­Ρ‚Π° функция просто добавляСт amountΠΊΒ runningTotal, ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚.

ΠŸΡ€ΠΈ рассмотрСнии Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ влоТСнная incrementer()функция ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ Π½Π΅ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΉ:

func incrementer() -> Int {

runningTotal += amount

return runningTotal

}

incrementer()Ѐункция Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ², ΠΈ всС ТС это относится ΠΊΒ runningTotalΠΈΒ amountΠ²Π½ΡƒΡ‚Ρ€ΠΈ Π΅Π³ΠΎ Ρ‚Π΅Π»Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.Β Π­Ρ‚ΠΎ дСлаСтся ΠΏΡƒΡ‚Π΅ΠΌ захвата ссылки на runningTotalΠΈΒ amountΠΈΠ· ΠΎΠΊΡ€ΡƒΠΆΠ°ΡŽΡ‰Π΅ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ использования ΠΈΡ… Π² своСм собствСнном Ρ‚Π΅Π»Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.Β Π—Π°Ρ…Π²Π°Ρ‚ΠΈΠ² ΠΏΠΎ ссылкС Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ ,Β Ρ‡Ρ‚ΠΎΒ runningTotalΠΈΒ amountΠ½Π΅ исчСзаСт ,Β ΠΊΠΎΠ³Π΄Π° Π²Ρ‹Π·ΠΎΠ²Β makeIncrementerΠΊΠΎΠ½Ρ†ΠΎΠ², Π° Ρ‚Π°ΠΊΠΆΠ΅ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ ,Β Ρ‡Ρ‚ΠΎΒ runningTotalдоступно Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ€Π°Π·Β incrementerфункция вызываСтся.

Π—ΠΠœΠ•Π’ΠšΠ

Π’ качСствС ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ Swift ΠΌΠΎΠΆΠ΅Ρ‚ вмСсто этого Π·Π°Ρ…Π²Π°Ρ‚ΠΈΡ‚ΡŒ ΠΈ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒΒ ΠΊΠΎΠΏΠΈΡŽΒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡ, Ссли это Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΎ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ΠΌ ΠΈ Ссли Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΎ послС создания замыкания.

Swift Ρ‚Π°ΠΊΠΆΠ΅ управляСт всСм ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ, связанным с ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ΠΌ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ΠΈ большС Π½Π΅ Π½ΡƒΠΆΠ½Ρ‹.

Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Β makeIncrementerΠ² дСйствии:

let incrementByTen = makeIncrementer(forIncrement: 10)

Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ устанавливаСтся константа, вызываСмая incrementByTenдля ссылки Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚Π°, которая добавляСт 10ΠΊ своСй runningTotalΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½Π° вызываСтся.Β ΠœΠ½ΠΎΠ³ΠΎΠΊΡ€Π°Ρ‚Π½Ρ‹ΠΉ Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ это ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² дСйствии:

incrementByTen()

// returns a value of 10

incrementByTen()

// returns a value of 20

incrementByTen()

// returns a value of 30

Если Π²Ρ‹ создадитС Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚, ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ ΡΠΎΠ±ΡΡ‚Π²Π΅Π½Π½ΡƒΡŽ ΡΠΎΡ…Ρ€Π°Π½Π΅Π½Π½ΡƒΡŽ ссылку Π½Π° Π½ΠΎΠ²ΡƒΡŽ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΡƒΡŽΒ runningTotalΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ:

let incrementBySeven = makeIncrementer(forIncrement: 7)

incrementBySeven()

// returns a value of 7

ΠŸΠΎΠ²Ρ‚ΠΎΡ€Π½Ρ‹ΠΉ Π²Ρ‹Π·ΠΎΠ² исходного incrementer (Β incrementByTen) ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅Ρ‚ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Ρ‚ΡŒ ΡΠΎΠ±ΡΡ‚Π²Π΅Π½Π½ΡƒΡŽΒ runningTotalΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ ΠΈ Π½Π΅ влияСт Π½Π° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ, Π·Π°Ρ…Π²Π°Ρ‡Π΅Π½Π½ΡƒΡŽΒ incrementBySeven:

incrementByTen()

// returns a value of 40

Π—ΠΠœΠ•Π’ΠšΠ

Если Π²Ρ‹ Π½Π°Π·Π½Π°Ρ‡Π°Π΅Ρ‚Π΅ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ свойству экзСмпляра класса, ΠΈ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ Π·Π°Ρ…Π²Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ этот экзСмпляр, ΡΡΡ‹Π»Π°ΡΡΡŒ Π½Π° экзСмпляр ΠΈΠ»ΠΈ Π΅Π³ΠΎ Ρ‡Π»Π΅Π½Ρ‹, Π²Ρ‹ создадитС ΡΠΈΠ»ΡŒΠ½Ρ‹ΠΉ ссылочный Ρ†ΠΈΠΊΠ» ΠΌΠ΅ΠΆΠ΄Ρƒ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ΠΌ ΠΈ экзСмпляром.Β Swift ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Β ΡΠΏΠΈΡΠΊΠΈ Π·Π°Ρ…Π²Π°Ρ‚Π°,Β Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ€Π°Π·ΠΎΡ€Π²Π°Ρ‚ΡŒ эти ΡΠΈΠ»ΡŒΠ½Ρ‹Π΅ Ρ†ΠΈΠΊΠ»Ρ‹ ссылок. Для получСния Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ см.Β Strong Reference Cycles для Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠΉΒ .

Замыкания ΡΠ²Π»ΡΡŽΡ‚ΡΡ ссылочными Ρ‚ΠΈΠΏΠ°ΠΌΠΈ

Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π²Ρ‹ΡˆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅,Β incrementBySevenΠΈΒ incrementByTenпостоянныС, Π½ΠΎ замыкания эти константы относятся ΠΊ Π΅Ρ‰Π΅ способны ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Ρ‚ΡŒ Ρ‚Π΅Β runningTotalΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ,Β ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ½ΠΈ Π·Π°Ρ…Π²Π°Ρ‚ΠΈΠ»ΠΈ.Β Π­Ρ‚ΠΎ ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ замыкания ΡΠ²Π»ΡΡŽΡ‚ΡΡΒ ΡΡΡ‹Π»ΠΎΡ‡Π½Ρ‹ΠΌΠΈ Ρ‚ΠΈΠΏΠ°ΠΌΠΈΒ .

Всякий Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ Π½Π°Π·Π½Π°Ρ‡Π°Π΅Ρ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΈΠ»ΠΈ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ для константы ΠΈΠ»ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, Π²Ρ‹ фактичСски устанавливаСтС эту константу ΠΈΠ»ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ как ссылкуна Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΈΠ»ΠΈ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅.Β Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π²Ρ‹ΡˆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ это Π²Ρ‹Π±ΠΎΡ€ Π·Π°Ρ‚Π²ΠΎΡ€Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉΒ incrementByTen относится к константС, Π° Π½Π΅ содСрТимоС самого Π·Π°Ρ‚Π²ΠΎΡ€Π°.

Π­Ρ‚ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Ссли Π²Ρ‹ Π½Π°Π·Π½Π°Ρ‡Π°Π΅Ρ‚Π΅ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ Π΄Π²ΡƒΠΌ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌ константам ΠΈΠ»ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ, ΠΎΠ±Π΅ эти константы ΠΈΠ»ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΡΡΡ‹Π»Π°ΡŽΡ‚ΡΡ Π½Π° ΠΎΠ΄Π½ΠΎ ΠΈ Ρ‚ΠΎ ΠΆΠ΅ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅.

let alsoIncrementByTen = incrementByTen

alsoIncrementByTen()

// returns a value of 50



incrementByTen()

// returns a value of 60

Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π²Ρ‹ΡˆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ, Ρ‡Ρ‚ΠΎ Π²Ρ‹Π·ΠΎΠ²Β alsoIncrementByTenΠ°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π΅Π½ Π²Ρ‹Π·ΠΎΠ²ΡƒΒ incrementByTen.Β ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ±Π° ΠΎΠ½ΠΈ относятся ΠΊ ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΈ Ρ‚ΠΎΠΌΡƒ ΠΆΠ΅ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΡŽ, ΠΎΠ½ΠΈ ΠΎΠ±Π° ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°ΡŽΡ‚ ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹ΠΉ ΠΈΡ‚ΠΎΠ³.

Π­ΠΊΡ€Π°Π½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅

Говорят, Ρ‡Ρ‚ΠΎ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅Β ΡΠΊΡ€Π°Π½ΠΈΡ€ΡƒΠ΅Ρ‚Β Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, ΠΊΠΎΠ³Π΄Π° Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ пСрСдаСтся Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π½ΠΎ вызываСтся послС Π΅Π΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π°. Когда Π²Ρ‹ ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ Π² качСствС ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· своих ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ², Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΈΡΠ°Ρ‚ΡŒΒ @escapingΠΏΠ΅Ρ€Π΅Π΄ Ρ‚ΠΈΠΏΠΎΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΡŽ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΎ ΡΠΊΡ€Π°Π½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ.

Один ΠΈΠ· способов ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ замыкания — ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π΅Π³ΠΎ Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Π°ΠΌΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. НапримСр, ΠΌΠ½ΠΎΠ³ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π·Π°ΠΏΡƒΡΠΊΠ°ΡŽΡ‚ Π°ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½Π½ΡƒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ, ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ Π² качСствС ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ замыкания. Ѐункция возвращаСтся послС запуска ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, Π½ΠΎ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ Π½Π΅ вызываСтся Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° опСрация Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½Π° — Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Π΅Π³ΠΎ ΠΏΠΎΠ·ΠΆΠ΅. НапримСр:

var completionHandlers: [() -> Void] = []

func someFunctionWithEscapingClosure(completionHandler: @escaping () -> Void) {

completionHandlers.append(completionHandler)

}

someFunctionWithEscapingClosure(_:)Ѐункция ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ в качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° ΠΈ добавляСт Π΅Π³ΠΎ Π² массив ,Β ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ объявлСн Π²Π½Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Если Π²Ρ‹ Π½Π΅ ΠΏΠΎΠΌΠ΅Ρ‚ΠΈΠ»ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈΒ @escaping, Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ ΠΎΡˆΠΈΠ±ΠΊΡƒ Π²ΠΎ врСмя компиляции.

ΠœΠ°Ρ€ΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° закрытия @escapingΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹Β selfΡΠ²Π½ΠΎΒ ΡΡΡ‹Π»Π°Ρ‚ΡŒΡΡ Π½Π°Β Π½Π΅Π³ΠΎ. НапримСр, Π² ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π½ΠΈΠΆΠ΅ ΠΊΠΎΠ΄Π΅ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½ΠΎΠ΅ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅Β someFunctionWithEscapingClosure(_:)являСтся ΡΠΊΡ€Π°Π½ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΌ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΡΡΡ‹Π»Π°Ρ‚ΡŒΡΡΒ selfявно. Напротив, ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½ΠΎΠ΅ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅Β someFunctionWithNonescapingClosure(_:)являСтся Π½Π΅ΡΡΠΊΠ°ΠΏΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΌ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΡΡ‹Π»Π°Ρ‚ΡŒΡΡΒ selfнСявно.

func someFunctionWithNonescapingClosure(closure: () -> Void) {

closure()

}



class SomeClass {

var x = 10

func doSomething() {

someFunctionWithEscapingClosure { self.x = 100 }

someFunctionWithNonescapingClosure { x = 200 }

}

}



let instance = SomeClass()

instance.doSomething()

print(instance.x)

// Prints "200"



completionHandlers.first?()

print(instance.x)

// Prints "100"

Autoclosures

Autoclosure являСтся Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ создаСтся автоматичСски ,Β Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±Π΅Ρ€Π½ΡƒΡ‚ΡŒ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, это врСмя пСрСдаСтся в качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Он Π½Π΅ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ², ΠΈ ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ вызываСтся, ΠΎΠ½ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ выраТСния, Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½Π½ΠΎΠ³ΠΎ Π² Π½Π΅Π³ΠΎ.Β Π­Ρ‚ΠΎ синтаксичСскоС удобство позволяСт ΠΎΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ скобки Π²ΠΎΠΊΡ€ΡƒΠ³ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, записывая Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎΠ΅ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ вмСсто явного замыкания.

Π Π°ΡΠΏΡ€ΠΎΡΡ‚Ρ€Π°Π½Π΅Π½ΠΎΒ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒΒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ Π°Π²Ρ‚ΠΎΠ·Π°ΠΌΠ΅Π½Ρ‹, Π½ΠΎ это Π½Π΅ распространСно для рСализации такого Ρ€ΠΎΠ΄Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. НапримСр,Β assert(condition:message:file:line:)функция ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ autoclosure для своих conditionΠΈΒ messageΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ²;Β Π΅Π³ΠΎΒ conditionΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ оцСниваСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² ΠΎΡ‚Π»Π°Π΄ΠΎΡ‡Π½Ρ‹Ρ… сборках, Π° Π΅Π³ΠΎΒ messageΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ оцСниваСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Ρ‚ΠΎΠΌ случаС, Ссли ΠΎΠ½Β conditionΠ΅ΡΡ‚ΡŒΒ false.

АвтоматичСскоС Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ позволяСт ΠΎΡ‚Π»ΠΎΠΆΠΈΡ‚ΡŒ ΠΎΡ†Π΅Π½ΠΊΡƒ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ΄ Π²Π½ΡƒΡ‚Ρ€ΠΈ Π½Π΅ выполняСтся, ΠΏΠΎΠΊΠ° Π²Ρ‹ Π½Π΅ Π²Ρ‹Π·ΠΎΠ²Π΅Ρ‚Π΅ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅.Β Π—Π°Π΄Π΅Ρ€ΠΆΠΊΠ° ΠΎΡ†Π΅Π½ΠΊΠΈ ΠΏΠΎΠ»Π΅Π·Π½Π° для ΠΊΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΠΌΠ΅Π΅Ρ‚ ΠΏΠΎΠ±ΠΎΡ‡Π½Ρ‹Π΅ эффСкты ΠΈΠ»ΠΈ являСтся дорогостоящим Π² Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΌ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΈ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΎΠ½ позволяСт Π²Π°ΠΌ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, ΠΊΠΎΠ³Π΄Π° этот ΠΊΠΎΠ΄ оцСниваСтся. Код Π½ΠΈΠΆΠ΅ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, ΠΊΠ°ΠΊ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ Π·Π°Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΎΡ†Π΅Π½ΠΊΡƒ.

var customersInLine = ["Chris", "Alex", "Ewa", "Barry", "Daniella"]

print(customersInLine.count)

// Prints "5"



let customerProvider = { customersInLine.remove(at: 0) }

print(customersInLine.count)

// Prints "5"



print("Now serving \(customerProvider())!")

// Prints "Now serving Chris!"

print(customersInLine.count)

// Prints "4"

Π”Π°ΠΆΠ΅ Ссли ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ элСмСнт customersInLineмассива удаляСтся ΠΊΠΎΠ΄ΠΎΠΌ Π²Π½ΡƒΡ‚Ρ€ΠΈ замыкания, элСмСнт массива Π½Π΅ удаляСтся Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ фактичСски Π²Ρ‹Π·Π²Π°Π½ΠΎ. Если Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ вызываСтся, Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π²Π½ΡƒΡ‚Ρ€ΠΈ замыкания Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ вычисляСтся, Ρ‡Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ элСмСнт массива Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ удаляСтся.Β ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Ρ‚ΠΈΠΏΒ customerProvider— это Π½Π΅Β Stringпросто функция Π±Π΅Π· ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ², которая Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ строку.()Β ->Β String

Π’Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚Π΅ Ρ‚Π°ΠΊΠΎΠ΅ ΠΆΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΎΡ‚Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠΉ ΠΎΡ†Π΅Π½ΠΊΠΈ, ΠΊΠΎΠ³Π΄Π° ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚Π΅ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

// customersInLine is ["Alex", "Ewa", "Barry", "Daniella"]

func serve(customer customerProvider: () -> String) {

print("Now serving \(customerProvider())!")

}

serve(customer: { customersInLine.remove(at: 0) } )

// Prints "Now serving Alex!"

serve(customer:)Ѐункция Π² листингС Π²Ρ‹ΡˆΠ΅ трСбуСтся явноС Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ ,Β ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ имя ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°. ВСрсия serve(customer:)Π½ΠΈΠΆΠ΅ выполняСт Ρ‚Ρƒ ΠΆΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ, Π½ΠΎ вмСсто явного закрытия ΠΎΠ½Π° выполняСт Π°Π²Ρ‚ΠΎΠ·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅, помСчая Ρ‚ΠΈΠΏ своСго ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°Β @autoclosureΠ°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠΌ.Β Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, ΠΊΠ°ΠΊ Ссли Π±Ρ‹ ΠΎΠ½Π° взяла StringΠ°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ вмСсто замыкания. АргумСнт автоматичСски прСобразуСтся Π² Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒΒ customerProviderΡ‚ΠΈΠΏ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° помСчаСтся @autoclosureΠ°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠΌ.

// customersInLine is ["Ewa", "Barry", "Daniella"]

func serve(customer customerProvider: @autoclosure () -> String) {

print("Now serving \(customerProvider())!")

}

serve(customer: customersInLine.remove(at: 0))

// Prints "Now serving Ewa!"

Π—ΠΠœΠ•Π’ΠšΠ

Π§Ρ€Π΅Π·ΠΌΠ΅Ρ€Π½ΠΎΠ΅ использованиС Π°Π²Ρ‚ΠΎΠ·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Ρ‚Ρ€ΡƒΠ΄Π½ΠΈΡ‚ΡŒ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ вашСго ΠΊΠΎΠ΄Π°.Β ΠšΠΎΠ½Ρ‚Π΅ΠΊΡΡ‚ ΠΈ имя Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΡ€ΠΎΡΡΠ½ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΡ†Π΅Π½ΠΊΠ° откладываСтся.

Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ autoclosure ,Β Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΠ»ΠΎ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊΒ @autoclosureΠΈΒ @escapingΠ°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹.Β @escapingАтрибут описано Π²Ρ‹ΡˆΠ΅ Π²Β Π­ΠΊΡ€Π°Π½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ClosuresΒ .

// customersInLine is ["Barry", "Daniella"]

var customerProviders: [() -> String] = []

func collectCustomerProviders(_ customerProvider: @autoclosure @escaping () -> String) {

customerProviders.append(customerProvider)

}

collectCustomerProviders(customersInLine.remove(at: 0))

collectCustomerProviders(customersInLine.remove(at: 0))



print("Collected \(customerProviders.count) closures.")

// Prints "Collected 2 closures."

for customerProvider in customerProviders {

print("Now serving \(customerProvider())!")

}

// Prints "Now serving Barry!"

// Prints "Now serving Daniella!"

Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π²Ρ‹ΡˆΠ΅ ΠΊΠΎΠ΄Π΅ вмСсто Π²Ρ‹Π·ΠΎΠ²Π° замыкания, ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½ΠΎΠ³ΠΎ Π΅ΠΌΡƒ Π² качСствС customerProviderΠ°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°,Β collectCustomerProviders(_:)функция добавляСт Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ ΠΊΒ customerProvidersмассиву. Массив ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚ΡΡ Π²Π½Π΅ области дСйствия Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ρ‡Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ замыкания Π² массивС ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Ρ‹ послС Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.Β Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅Β customerProviderΠ°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΎ Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Π°ΠΌΠΈ области дСйствия Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

Π£Π²Π°ΠΆΠ°Π΅ΠΌΡ‹ΠΉ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ! Π Π΅ΠΊΠ»Π°ΠΌΠ° ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ ΠΈ Ρ€Π°Π·Π²ΠΈΠ²Π°Ρ‚ΡŒ наш ΠΏΡ€ΠΎΠ΅ΠΊΡ‚, дСлая Π΅Π³ΠΎ простым ΠΈ ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΌ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ для Вас. Если ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ интСрСсный ΠΈ Π²Π°ΠΆΠ½Ρ‹ΠΉ для Вас, Ρ‚ΠΎ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ Π½Π° Π½Π΅ΠΌ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊ Ρ€Π΅ΠΊΠ»Π°ΠΌΡ‹. Бпасибо, Ρ‡Ρ‚ΠΎ Ρ‡ΠΈΡ‚Π°Π΅Ρ‚Π΅ сайт!

9.1. Замыкания — ΠžΡΠ½ΠΎΠ²Ρ‹ | Swift World

let strings = numbers.map{ (number) -> String in
    var number = number
    var output = ""
    repeat {
        output = digitNames[number % 10]! + output
        number /= 10
    } while number > 0
    return output
}
// strings Π²Ρ‹Π²Π΅Π΄Π΅Π½ΠΎ Π² Ρ‚ΠΈΠΏ [String]
// Π΅Π³ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ€Π°Π²Π½ΠΎ ["OneSix", "FiveEight", "FiveOneZero"]
Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ массив numbers для создания массива Ρ‚ΠΈΠΏΠ° String, ΠΏΠ΅Ρ€Π΅Π΄Π°Π² Π² ΠΌΠ΅Ρ‚ΠΎΠ΄ массива map(_:) волочащССся Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅.

ΠœΠ΅Ρ‚ΠΎΠ΄ map(_:) Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ Π΅Π΄ΠΈΠ½ΠΎΠΆΠ΄Ρ‹ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ элСмСнта Π² массивС. Π’Π°ΠΌ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ явно ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Ρ‚ΠΈΠΏ Π²Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° замыкания, number, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ этот Ρ‚ΠΈΠΏ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹Π²Π΅Π΄Π΅Π½ ΠΈΠ· Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅ΠΌΠΎΠ³ΠΎ массива.

Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ пСрСмСнная number инициализируСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° замыкания number, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ это Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΎ Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ‚Π΅Π»Π° замыкания. (ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠΉ всСгда константы.) Π—Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ Ρ‚Π°ΠΊ ΠΆΠ΅ спСцифицируСт Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹ΠΉ Ρ‚ΠΈΠΏ String, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊΠΈΠΎΠΉ Ρ‚ΠΈΠΏ Π±ΡƒΠ΄Π΅Ρ‚ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒΡΡ Π² ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΡ‘Π½Π½ΠΎΠΌ Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠΌ массивС.

Π—Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ строит строку с Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ output всякий Ρ€Π°Π· ΠΏΡ€ΠΈ своём Π²Ρ‹Π·ΠΎΠ²Π΅. Оно вычисляСт послСднюю Ρ†ΠΈΡ„Ρ€Ρƒ number с использованиСм ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° остатка ΠΎΡ‚ дСлСния (number % 10) ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ эту Ρ†ΠΈΡ„Ρ€Ρƒ для Π²Ρ‹Π±ΠΎΡ€Π° подходящСй строки Π² словарС digitNames. Π­Ρ‚ΠΎ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ использовано для создания строки, ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°ΡŽΡ‰Π΅ΠΉ любоС Ρ†Π΅Π»ΠΎΠ΅ число, большСС 0.

Π’Ρ‹Π·ΠΎΠ² сабскрипта словаря digitNames сопровоТдаСтся Π²ΠΎΡΠΊΠ»ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ Π·Π½Π°ΠΊΠΎΠΌ (!), Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ сабскрипты словарСй Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ для ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ†ΠΈΠΈ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π²Ρ‹Π±ΠΎΡ€ значСния ΠΈΠ· словаря ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΠ²Π°Π»ΠΈΡ‚ΡŒΡΡ, Ссли ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ ΠΊΠ»ΡŽΡ‡ Π½Π΅ сущСствуСт. Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π’Ρ‹ΡˆΠ΅ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΎ, Ρ‡Ρ‚ΠΎ number % 10 всСгда Π±ΡƒΠ΄Π΅Ρ‚ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹ΠΌ ΠΊΠ»ΡŽΡ‡ΠΎΠΌ сабскрита для словаря digitNames, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Π²ΠΎΡΠΊΠ»ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Π·Π½Π°ΠΊ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ распаковки значСния Ρ‚ΠΈΠΏΠ° String, Ρ…Ρ€Π°Π½ΠΈΠΌΠΎΠ³ΠΎ Π² ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠΌ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΈ сабскрипта.

Π‘Ρ‚Ρ€ΠΎΠΊΠ°, получСнная ΠΈΠ· словаря digitNames прибавляСтся Π² ΠΏΠ΅Ρ€Π΅Π΄Π½ΡŽΡŽ Ρ‡Π°ΡΡ‚ΡŒ output, эффСктивно создавая строковыС прСдставлСниС числа Π² ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΌ порядкС. (Π’Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ number % 10 Π΄Π°Ρ‘Ρ‚ число 6 для 16, 8 для 58 ΠΈ 0 для 510.)

ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ number Π·Π°Ρ‚Π΅ΠΌ дСлится Π½Π° 10. Π’Π°ΠΊ ΠΊΠ°ΠΊ это Ρ†Π΅Π»ΠΎΠ΅ число, Ρ‚ΠΎ ΠΎΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΊΡ€ΡƒΠ³Π»Π΅Π½ΠΎ Π²Π½ΠΈΠ· ΠΏΡ€ΠΈ Π΄Π΅Π»Π΅Π½ΠΈΠΈ, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ 16 станСт 1, 58 станСт 5, Π° 510 станСт 51.

Π­Ρ‚ΠΎΡ‚ процСсс повторяСтся, ΠΏΠΎΠΊΠ° number Π½Π΅ станСт Ρ€Π°Π²Π΅Π½ 0, Π² этот ΠΌΠΎΠΌΠ΅Π½Ρ‚ строка output Π±ΡƒΠ΄Π΅Ρ‚ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½Π° Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ΠΌ ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π° Π² Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠΉ массив ΠΌΠ΅Ρ‚ΠΎΠ΄Π° map(_:).

ИспользованиС синтаксиса trailing-замыкания Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π²Ρ‹ΡˆΠ΅ позволяСт ΠΈΠ½ΠΊΠ°ΡΠΏΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ замыкания сразу послС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‰Π΅ΠΉ это Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ Π±Π΅Π· нСобходимости ΠΎΠ±ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Ρ‚ΡŒ всё Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ Π²ΠΎ внСшнюю ΠΊΡ€ΡƒΠ³Π»ΡƒΡŽ скобку ΠΌΠ΅Ρ‚ΠΎΠ΄Π° map(_:).

Замыкания (closure) Π² Swift – Swiftme.ru

Замыкания (closure), ΠΈΠ»ΠΈ Π·Π°ΠΌΡ‹ΠΊΠ°ΡŽΡ‰ΠΈΠ΅ выраТСния β€” это сгруппированный ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½ Π² Π²ΠΈΠ΄Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎ использован. НичСго Π½Π΅ Π½Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅Ρ‚? Если Π²Ρ‹ скаТСтС, Ρ‡Ρ‚ΠΎ Π² этом ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ ΡƒΠ·Π½Π°Π»ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚Π΅ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΏΡ€Π°Π²Ρ‹. ΠŸΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΠΌ ΠΎΠ± этом ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅.

Π—Π°Π΄Π°Π½ΠΈΠ΅ 1

1)ΠΠ°ΠΏΠΈΡˆΠΈΡ‚Π΅ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ Π²Ρ‹Π²ΠΎΠ΄ Π½Π° консоль сообщСния β€œHello, World!”.
2)Π’Ρ‹Π·ΠΎΠ²ΠΈΡ‚Π΅ Π΄Π°Π½Π½ΠΎΠ΅ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅
3)Какой Ρ‚ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ… Ρƒ Π΄Π°Π½Π½ΠΎΠ³ΠΎ замыкания?

ΠŸΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ ΠΎΡ‚Π²Π΅Ρ‚

//1)
// для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ ΠΌΠΎΠ³Π»ΠΎ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹Π·Π²Π°Π½ΠΎ, ΠΎΠ½ΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρƒ
let closureHello = { print("Hello, World!") }
//2)
closureHello()
//3)
//Π’ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ… замыкания: () -> ()
type(of:closureHello) // (() -> ()).Type

Β 

Π—Π°Π΄Π°Π½ΠΈΠ΅ 2

Из прСдставлСнных Π½ΠΈΠΆΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² ΡƒΠΊΠ°ΠΆΠΈΡ‚Π΅ Ρ‚Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ Π½Π° Ρ‚ΠΎ:

1) Ρ‡Ρ‚ΠΎ функция/Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ Π½Π΅ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΈ Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚
2) Ρ‡Ρ‚ΠΎ функция ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΎΠ΄ΠΈΠ½ Π²Ρ…ΠΎΠ΄Π½ΠΎΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚
3) Ρ‡Ρ‚ΠΎ функция Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅

() -> (:)
(_) -> ()
(Int) -> () -> ()
() -> Void
() -> (String)
() -> ()

ΠŸΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ ΠΎΡ‚Π²Π΅Ρ‚

1)
4 ΠΈ 6
2)
3, Ρ‚.ΠΊ. функция ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π²Ρ…ΠΎΠ΄Π½ΠΎΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ Ρ‚ΠΈΠΏΠ° Int, Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠΉ ΠΊ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠΌΡƒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ Π² Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ΄Π·Π°Π΄Π°Π½ΠΈΠΈ Π½Π΅Ρ‚)
3)
3, Ρ‚.ΠΊ. функция Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° () -> ()
5, Ρ‚.ΠΊ. функция Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° String

Β 

Π—Π°Π΄Π°Π½ΠΈΠ΅ 3

1) ΠΠ°ΠΏΠΈΡˆΠΈΡ‚Π΅ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π½Π° Π²Ρ…ΠΎΠ΄ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Ρ‚ΠΈΠΏΠ° String ΠΈ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ Π΅Π³ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π½Π° консоль.
2) Π’Ρ‹Π·ΠΎΠ²ΠΈΡ‚Π΅ Π΄Π°Π½Π½ΠΎΠ΅ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅
3) Какой Ρ‚ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ… Ρƒ Π΄Π°Π½Π½ΠΎΠ³ΠΎ замыкания?

ΠŸΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ ΠΎΡ‚Π²Π΅Ρ‚

//1)
let closurePrintMessage = { (message: String) in
    print(message)
}
//2)
closurePrintMessage("Π­Ρ‚ΠΎΡ‚ тСкст Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π²Π΅Π΄Π΅Π½ Π½Π° консоль")

// Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ, ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΉ Π’ΠΈΠΌΡƒΡ€ΠΎΠΌ @magic1620
let printString: (String) -> () = { print($0) }


Β 

Π—Π°Π΄Π°Π½ΠΈΠ΅ 4

1) ΠΠ°ΠΏΠΈΡˆΠΈΡ‚Π΅ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π½Π° Π²Ρ…ΠΎΠ΄ Π΄Π²Π° цСлочислСнных ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΈΡ… сумму.
2) ΠŸΡ€ΠΎΡ‚Π΅ΡΡ‚ΠΈΡ€ΡƒΠΉΡ‚Π΅ Ρ€Π°Π±ΠΎΡ‚Ρƒ Π΄Π°Π½Π½ΠΎΠ³ΠΎ замыкания
3) Какой Ρ‚ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ… Π±ΡƒΠ΄Π΅Ρ‚ Ρƒ Π΄Π°Π½Π½ΠΎΠ³ΠΎ замыкания?

ΠŸΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ ΠΎΡ‚Π²Π΅Ρ‚

//1)
let closureSumOfTwoInt = { (a: Int, b: Int) in
    return a + b
}
//2)
closureSumOfTwoInt(4,7) //11
//3)
// Ρ‚ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ… - (Int, Int) -> Int
type(of: closureSumOfTwoInt) // ((Int, Int) -> Int).Type

Β 

Доступ Π·Π°ΠΊΡ€Ρ‹Ρ‚

Π—Π°Ρ…Π²Π°Ρ‚ контСкста замыканиями вмСсто дСлСгирования Π² iOS 8 Swift / Habr

ΠŸΡ€ΠΈ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ iOS ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ со ΠΌΠ½ΠΎΠ³ΠΈΠΌΠΈ MVC приходится Ρ€Π΅ΡˆΠ°Ρ‚ΡŒ вопросы ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎΡ‚ ΠΎΠ΄Π½ΠΎΠ³ΠΎ MVC ΠΊ Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ ΠΊΠ°ΠΊ Π² прямом, Ρ‚Π°ΠΊ ΠΈ Π² ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΌ Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠΈ. ΠŸΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ Π² прямом Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠΈ ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π΅ ΠΎΡ‚ ΠΎΠ΄Π½ΠΎΠ³ΠΎ MVC ΠΊ ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌΡƒ осущСствляСтся ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ установкой MΠΎΠ΄Π΅Π»ΠΈ Ρ‚ΠΎΠ³ΠΎ MVC, ΠΊΡƒΠ΄Π° ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΠΌ, Π° Π²ΠΎΡ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ Β«Π½Π°Π·Π°Π΄Β» ΠΈΠ· Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ MVC Π² ΠΏΡ€Π΅Π΄ΡˆΠ΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ осущСствляСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ дСлСгирования ΠΊΠ°ΠΊ Π² Objective-C, Ρ‚Π°ΠΊ ΠΈ Π² Swift.

ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Π΄Π΅Π»Π΅Π³ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ MVC ΠΌΠ΅ΠΆΠ΄Ρƒ View ΠΈ Controller для их «слСпого взаимодСйствия».

Π”Π΅Π»ΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Views β€” слишком ΠΎΠ±ΠΎΡ‰Π΅Π½Π½Ρ‹Π΅ (generic) стандартизованныС ΡΡ‚Ρ€ΠΎΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Π±Π»ΠΎΠΊΠΈ, ΠΎΠ½ΠΈ Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π·Π½Π°Ρ‚ΡŒ Π½ΠΈ ΠΎ классС, Π½ΠΈ ΠΎ Controller, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡ… ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚. Views Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π²Π»Π°Π΄Π΅Ρ‚ΡŒ своими собствСнными Π΄Π°Π½Π½Ρ‹ΠΌΠΈ, Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ‚ Controller. Π’ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ, Π΄Π°Π½Π½Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Π² MΠΎΠ΄Π΅Π»ΠΈ, Π½ΠΎ Controller являСтся отвСтствСнным Π·Π° ΠΈΡ… прСдоставлСниС. Π’ΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ ΠΆΠ΅ Β View ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠ±Ρ‰Π°Ρ‚ΡŒΡΡ с Controller? Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ дСлСгирования.

НуТно Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ 6 шагов, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Π½Π΅Π΄Ρ€ΠΈΡ‚ΡŒ Π΄Π΅Π»Π΅Π³ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π²ΠΎ взаимодСйствиС View ΠΈ Controller:

  1. Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» дСлСгирования (опрСдСляСм Ρ‚ΠΎ, ΠΎ Ρ‡Π΅ΠΌ View Ρ…ΠΎΡ‡Π΅Ρ‚, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Controller позаботился)
  2. Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ Π² View weak свойство delegate, Ρ‚ΠΈΠΏΠΎΠΌ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» дСлСгирования
  3. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Π² View свойство delegate, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅/ Π΄Π΅Π»Π°Ρ‚ΡŒ Π²Π΅Ρ‰ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ View Β Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Π»Π°Π΄Π΅Ρ‚ΡŒ ΠΈΠ»ΠΈ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ
  4. Controller ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΎΠ½ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»
  5. Controller устанавливаСт self (самого сСбя) ΠΊΠ°ΠΊ Π΄Π΅Π»Π΅Π³Π°Ρ‚Π° View ΠΏΡƒΡ‚Π΅ΠΌ установки свойства Π² ΠΏΡƒΠ½ΠΊΡ‚Π΅ #2, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π²Ρ‹ΡˆΠ΅
  6. Π Π΅Π°Π»ΠΈΠ·ΡƒΠ΅ΠΌ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» Π² Controller

ΠœΡ‹ Π²ΠΈΠ΄ΠΈΠΌ, Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π΅Π³ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ β€” Π½Π΅ простой процСсс.
Как Π² Swift, Ρ‚Π°ΠΊ ΠΈ Π² Objective-C, процСсс дСлСгирования ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ использованиСм Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠΉ (Π±Π»ΠΎΠΊΠΎΠ²), принимая Π²ΠΎ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ ΠΈΡ… ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡ‚ΡŒ Π·Π°Ρ…Π²Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ Π»ΡŽΠ±Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΈΠ· ΠΎΠΊΡ€ΡƒΠΆΠ°ΡŽΡ‰Π΅Π³ΠΎ контСкста для Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅Π³ΠΎ использования. Однако Π² Swift рСализация этой ΠΈΠ΄Π΅ΠΈ сущСствСнно упрощаСтся ΠΈ выглядит Π±ΠΎΠ»Π΅Π΅ Π»Π°ΠΊΠΎΠ½ΠΈΡ‡Π½ΠΎΠΉ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Β Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ (замыкания) Π² Swift ΡΠ²Π»ΡΡŽΡ‚ΡΡ Β«Π³Ρ€Π°ΠΆΠ΄Π°Π½Π°ΠΌΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ сорта», Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΠ±ΡŠΡΠ²Π»ΡΡ‚ΡŒΡΡ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒΡΡ ΠΊΠ°ΠΊ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. ΠŸΡ€ΠΎΡΡ‚ΠΎΡ‚Π° ΠΈ Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½Π°Ρ ΡΡΠ½ΠΎΡΡ‚ΡŒ ΠΊΠΎΠ΄Π° Π² Swift позволят Π±ΠΎΠ»Π΅Π΅ ΡˆΠΈΡ€ΠΎΠΊΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ замыкания (closures), Π·Π°Ρ…Π²Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‰ΠΈΠ΅ контСкст, для взаимодСйствия Π΄Π²ΡƒΡ… MVC ΠΈΠ»ΠΈ взаимодСйствия Controller ΠΈ ViewΒ Π±Π΅Π· примСнСния дСлСгирования.

Π― Ρ…ΠΎΡ‡Ρƒ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ использованиС Π·Π°Ρ…Π²Π°Ρ‚Π° контСкста замыканиями Π½Π° Π΄Π²ΡƒΡ… ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ…, взятых ΠΈΠ· стэнфордского курса 2015 Β«Developing iOS 8 Apps with Swift» (русский эквивалСнт находится Π½Π° сайтС Β«Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° iOS+Swift+Objective-C ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉΒ»).

Один ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π±ΡƒΠ΄Π΅Ρ‚ ΠΊΠ°ΡΠ°Ρ‚ΡŒΡΡ взаимодСйствия View Β ΠΈ Controller Π² ΠΏΡ€Π΅Π΄Π΅Π»Π°Ρ… ΠΎΠ΄Π½ΠΎΠ³ΠΎ MVC, Π° Π΄Ρ€ΡƒΠ³ΠΎΠΉ β€” Π΄Π²ΡƒΡ… Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… MVC. Π’ ΠΎΠ±ΠΎΠΈΡ… случаях Β Π·Π°Ρ…Π²Π°Ρ‚ контСкста замыканиями позволит Π½Π°ΠΌ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π΄Π΅Π»Π΅Π³ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π±ΠΎΠ»Π΅Π΅ простым ΠΈ элСгантным ΠΊΠΎΠ΄ΠΎΠΌ, Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‰ΠΈΠΌ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»ΠΎΠ² ΠΈ Π΄Π΅Π»Π΅Π³Π°Ρ‚ΠΎΠ².

Π’ Заданиях стэнфордского курса прСдлагаСтся Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ГрафичСский ΠΊΠ°Π»ΡŒΠΊΡƒΠ»ΡΡ‚ΠΎΡ€,

ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π° iPad выглядит состоящим ΠΈΠ· Π΄Π²ΡƒΡ… частСй: Π² Π»Π΅Π²ΠΎΠΉ части находится RPN (обратная польская запись) ΠΊΠ°Π»ΡŒΠΊΡƒΠ»ΡΡ‚ΠΎΡ€, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠΉ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΈΡ‚ΡŒ вычислСния, Π½ΠΎ ΠΈ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ M, Π·Π°Π΄Π°Π²Π°Ρ‚ΡŒ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, которая ΠΏΡ€ΠΈ Π½Π°ΠΆΠ°Ρ‚ΠΈΠΈ ΠΊΠ½ΠΎΠΏΠΊΠΈ «Π“Ρ€Π°Ρ„ΠΈΠΊ» графичСски воспроизводится Π² ΠΏΡ€Π°Π²ΠΎΠΉ части экрана. Π­Ρ‚ΠΈ выраТСния ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΠΎΠΌΠΈΠ½Π°Ρ‚ΡŒ Π² спискС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π½Π°ΠΆΠ°Ρ‚ΠΈΠ΅ΠΌ ΠΊΠ½ΠΎΠΏΠΊΠΈ «Add to Favorites» ΠΈ Π²ΠΎΡΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒ вСсь список Π·Π°ΠΏΠΎΠΌΠ½Π΅Π½Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠ½ΠΎΠΏΠΊΠΈ «Show Favorites«. Π’ спискС Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ Π»ΡŽΠ±ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ (рисунок Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ΅), ΠΈ ΠΎΠ½Π° Π±ΡƒΠ΄Π΅Ρ‚ построСна Π² графичСской части. ИмСя Π½Π°Π±ΠΎΡ€ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΈΡ… графичСскоС построСниС, Π½Π΅ прибСгая ΠΊ RPN ΠΊΠ°Π»ΡŒΠΊΡƒΠ»ΡΡ‚ΠΎΡ€Ρƒ.
ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ Π½Π΅Π½ΡƒΠΆΠ½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΈΠ· списка, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ТСст Swipe ( смахивания) справа Π½Π°Π»Π΅Π²ΠΎ.

Π― Π½Π΅ Π±ΡƒΠ΄Ρƒ ΠΎΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒΡΡ Π½Π° Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ RPN ΠΊΠ°Π»ΡŒΠΊΡƒΠ»ΡΡ‚ΠΎΡ€Π°, процСсс построСния Π΅Π³ΠΎ ΠΈΠ·Π»ΠΎΠΆΠ΅Π½ Π½Π° сайтС Β«Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° iOS+Swift+Objective-C ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉΒ». Нас Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠ½Ρ‚Π΅Ρ€Π΅ΡΠΎΠ²Π°Ρ‚ΡŒ графичСская Ρ‡Π°ΡΡ‚ΡŒ, ΠΈ Π² частности, ΠΊΠ°ΠΊ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ UIView ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Π΅ y= f(x) ΠΎΡ‚ своСго Controller, ΠΈ ΠΊΠ°ΠΊ стандартный Table View, ΠΏΠΎΡΠ²Π»ΡΡŽΡ‰ΠΈΠΉΡΡ Π² окошкС Popover, заставляСт Controller Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ MVC Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ Π½ΡƒΠΆΠ½Ρ‹ΠΉ Π³Ρ€Π°Ρ„ΠΈΠΊ ΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ синхронный список Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ.
ВсС MVC, ΡƒΡ‡Π°ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ «ГрафичСский ΠΊΠ°Π»ΡŒΠΊΡƒΠ»ΡΡ‚ΠΎΡ€Β», прСдставлСны Π½ΠΈΠΆΠ΅

ΠœΡ‹ Π²ΠΈΠ΄ΠΈΠΌ, Ρ‡Ρ‚ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Split View Controller, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Ρ€ΠΎΠ»ΡŒ Master стороны ΠΈΠ³Ρ€Π°Π΅Ρ‚ ΠΊΠ°Π»ΡŒΠΊΡƒΠ»ΡΡ‚ΠΎΡ€, способный Ρ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ зависимости Ρ‚ΠΈΠΏΠ° y= f(x), Π° Ρ€ΠΎΠ»ΡŒ Detail ΠΈΠ³Ρ€Π°Π΅Ρ‚ Π“Ρ€Π°Ρ„ΠΈΠΊ, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠΉ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ y= f(x). Нас Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠ½Ρ‚Π΅Ρ€Π΅ΡΠΎΠ²Π°Ρ‚ΡŒ Detail сторона Split View Controller, Π° ΠΈΠΌΠ΅Π½Π½ΠΎ MVC Β«Π“Ρ€Π°Ρ„ΠΈΠΊΒ», Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΌΡ‹ ΠΎΡ‚Ρ€Π°Π±ΠΎΡ‚Π°Π΅ΠΌ взаимодСйствиС View ΠΈ Controller Π² ΠΏΡ€Π΅Π΄Π΅Π»Π°Ρ… ΠΎΠ΄Π½ΠΎΠ³ΠΎ MVC, ΠΈ MVC «Бписок Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉΒ», Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΌΡ‹ ΠΎΡ‚Ρ€Π°Π±ΠΎΡ‚Π°Π΅ΠΌ Π΅Π³ΠΎ взаимодСйствиС с MVC Β«Π“Ρ€Π°Ρ„ΠΈΠΊΒ».

Π—Π°Ρ…Π²Π°Ρ‚ контСкста Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ΠΌ ΠΏΡ€ΠΈ взаимодСйствии View ΠΈ Controller Π² ΠΎΠ΄Π½ΠΎΠΌ MVC.


ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ Π½Π° MVC Β«Π“Ρ€Π°Ρ„ΠΈΠΊΒ», ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ управляСтся классом FavoritesGraphViewController.

ΠŸΡ€ΠΈ Π²Π½ΠΈΠΌΠ°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠΌ рассмотрСнии ΠΌΡ‹ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ класс FavoritesGraphViewController наслСдуСт ΠΎΡ‚ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса GraphViewController ΠΈ содСрТит Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ связано со списком Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, прСдставлСнном ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ favoritePrograms, которая являСтся массивом ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ для RPN ΠΊΠ°Π»ΡŒΠΊΡƒΠ»ΡΡ‚ΠΎΡ€Π°. Вся графичСская Ρ‡Π°ΡΡ‚ΡŒ скрыта Π² Π±Π°Π·ΠΎΠ²ΠΎΠΌ классС GraphViewController. Π‘ Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния поставлСнной Π² ΡΡ‚Π°Ρ‚ΡŒΠ΅ Π·Π°Π΄Π°Ρ‡ΠΈ, Π½Π°ΠΌ интСрСсСн ΠΈΠΌΠ΅Π½Π½ΠΎ Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ класс GraphViewController, Π° ΠΊ классу FavoritesGraphViewController ΠΌΡ‹ вСрнСмся Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ Ρ€Π°Π·Π΄Π΅Π»Π΅. Π­Ρ‚ΠΎ ΠΎΠ±Ρ‰ΠΈΠΉ ΠΏΡ€ΠΈΠ΅ΠΌ Π² iOS ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ, ΠΊΠΎΠ³Π΄Π° Π±ΠΎΠ»Π΅Π΅ ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½Π½Ρ‹ΠΉ класс остаСтся Π½Π΅Ρ‚Ρ€ΠΎΠ½ΡƒΡ‚Ρ‹ΠΌ, Π° всС «частности» вносятся Π² Π΅Π³ΠΎ subclass. Π’ Π΄Π°Π½Π½ΠΎΠΌ Ρ€Π°Π·Π΄Π΅Π»Π΅ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ схСма нашСго ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ интСрфСйса ΠΈΠΌΠ΅Π΅Ρ‚ Π±ΠΎΠ»Π΅Π΅ ΡƒΠΏΡ€ΠΎΡ‰Π΅Π½Π½Ρ‹ΠΉ Π²ΠΈΠ΄:

Π’ΠΎ Π΅ΡΡ‚ΡŒ MVC Β«Π“Ρ€Π°Ρ„ΠΈΠΊΒ» управляСтся классом GraphViewController, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ пСрСдаСтся ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° program RPN ΠΊΠ°Π»ΡŒΠΊΡƒΠ»ΡΡ‚ΠΎΡ€Π° для построСния Π³Ρ€Π°Ρ„ΠΈΠΊΠ° ( это MодСль MVC Β«Π“Ρ€Π°Ρ„ΠΈΠΊΒ»).

View этого MVC прСдставляСт собой ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ UIView, управляСмый классом GraphView.

ΠŸΠ΅Ρ€Π΅Π΄ Π½Π°ΠΌΠΈ поставлСна Π·Π°Π΄Π°Ρ‡Π° ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎ ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½Π½Ρ‹ΠΉ класс GraphView, способный ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ зависимости y = f(x). Π­Ρ‚ΠΎΡ‚ класс Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π·Π½Π°Ρ‚ΡŒ ΠΎ ΠΊΠ°Π»ΡŒΠΊΡƒΠ»ΡΡ‚ΠΎΡ€Π΅, ΠΎΠ½ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ Π³Ρ€Π°Ρ„ΠΈΠΊΠ΅ Π² Π²ΠΈΠ΄Π΅ ΠΎΠ±Ρ‰Π΅ΠΉ зависимости y = f(x) ΠΈ Π½Π΅ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… Π΄Π°Π½Π½Ρ‹Ρ…. Π‘ Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, Π² нашСм Controller, прСдставлСнным классом GraphViewController, ΠΊΠ°ΠΊ Ρ€Π°Π· ΠΈ содСрТится информация ΠΎ Π³Ρ€Π°Ρ„ΠΈΠΊΠ΅ y = f(x), Π½ΠΎ Π½Π΅ Π² явном Π²ΠΈΠ΄Π΅, Π° Π² Π²ΠΈΠ΄Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ program, которая ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ экзСмпляром brain RPN ΠΊΠ°Π»ΡŒΠΊΡƒΠ»ΡΡ‚ΠΎΡ€Π°.

ИмСя ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ x ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ y c ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠ°Π»ΡŒΠΊΡƒΠ»ΡΡ‚ΠΎΡ€Π° brain для установлСнной ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ program

Как ΡΠ²ΡΠ·Π°Ρ‚ΡŒ эти Π΄Π²Π° класса β€” GraphView ΠΈ GraphViewController, ΠΊΠΎΠ³Π΄Π° Ρƒ ΠΎΠ΄Π½ΠΎ ΠΈΠ· Π½ΠΈΡ… Π΅ΡΡ‚ΡŒ информация, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ нуТдаСтся Π΄Ρ€ΡƒΠ³ΠΎΠΉ? Π’Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½Ρ‹ΠΉ ΠΈ ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Ρ‹ΠΉ способ выполнСния этого ΠΊΠ°ΠΊ Π² Objective-C, Ρ‚Π°ΠΊ ΠΈ Π² Swift β€” это Π΄Π΅Π»Π΅Π³ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅. Об этом способС для Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Π½Π° Swift рассказано Π² постС Β«Π—Π°Π΄Π°Π½ΠΈΠ΅ 3. РСшСниС -ΠžΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ задания».

ΠœΡ‹ ΠΈΠ·Π±Ρ€Π°Π»ΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΡƒΡ‚ΡŒ β€” использованиС замыкания (closures), Π·Π°Ρ…Π²Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‰Π΅Π³ΠΎ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΈΠ· внСшнСго контСкста, для взаимодСйствия Π΄Π²ΡƒΡ… классов, Π² нашСм случаС GraphView ΠΈ GraphViewController.

ДобавляСм Π² класс GrapherView ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ-Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ yForX ΠΊΠ°ΠΊ public (not private), Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΅Π΅ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ Π² GrapherViewController

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Optional ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ yForX, нарисуСм Π³Ρ€Π°Ρ„ΠΈΠΊ Π² классС GrapView:

Π—Π°ΠΌΠ΅Ρ‚ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ для задания Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠΈ Optionals Π² случаС, ΠΊΠΎΠ³Π΄Π° сама функция являСтся Optional, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π½ΡƒΠΆΠ½ΠΎ Π²Π·ΡΡ‚ΡŒ Π² ΠΊΡ€ΡƒΠ³Π»Ρ‹Π΅ скобки, ΠΏΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π·Π½Π°ΠΊ ? вопроса, Π° Π·Π°Ρ‚Π΅ΠΌ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π΅Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹.
Π’ GraphViewController Π² ΠΠ°Π±Π»ΡŽΠ΄Π°Ρ‚Π΅Π»Π΅ didSet { } Бвойства GraphView! , ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ являСтся @IBOutlet, ΠΌΡ‹ установим Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ yForX Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ΠΎ Π·Π°Ρ…Π²Π°Ρ‚ΠΈΠ»ΠΎ ссылку Π½Π° экзСмпляр ΠΌΠΎΠ΅Π³ΠΎ ΠΊΠ°Π»ΡŒΠΊΡƒΠ»ΡΡ‚ΠΎΡ€ self.brain, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΡƒΠΆΠ΅ установлСна нуТная ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° program для построСния Π³Ρ€Π°Ρ„ΠΈΠΊΠ°. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· ΠΏΡ€ΠΈ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠΈ ΠΊ yForX Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ Β«Π·Π°Ρ…Π²Π°Ρ‡Π΅Π½Π½Ρ‹ΠΉΒ» ΠΊΠ°Π»ΡŒΠΊΡƒΠ»ΡΡ‚ΠΎΡ€, Π° это Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ.

ВсС. Никаких Π΄Π΅Π»Π΅Π³Π°Ρ‚ΠΎΠ², Π½ΠΈΠΊΠ°ΠΊΠΈΡ… ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»ΠΎΠ², Π½ΠΈΠΊΠ°ΠΊΠΈΡ… ΠΏΠΎΠ΄Ρ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½ΠΈΠΉ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»ΠΎΠ². ЕдинствСнноС β€” добавляСм Π² Ρ‚Π°ΠΊ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΉ список Β«Π·Π°Ρ…Π²Π°Ρ‚Π°Β» [unowned self ] для ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ цикличСских ссылок Π² памяти (ΠΎΠ± этом рассказываСтся Π² Π›Π΅ΠΊΡ†ΠΈΠΈ 9 курса Β«Developing iOS 8 Apps with SwiftΒ»).

Код на Github.

Π—Π°Ρ…Π²Π°Ρ‚ контСкста Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ΠΌ ΠΏΡ€ΠΈ взаимодСйствии Π΄Π²ΡƒΡ… MVC.


ВСрнСмся ΠΊ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρƒ ГрафичСского ΠΊΠ°Π»ΡŒΠΊΡƒΠ»ΡΡ‚ΠΎΡ€Π°, способного ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π³Ρ€Π°Ρ„ΠΈΠΊΠΎΠ² Π² ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΌ спискС ΠΈ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Ρ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ Π²Ρ‹Π±ΠΈΡ€Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠ· списка для графичСского прСдставлСния

Как Π±Ρ‹Π»ΠΎ ΡƒΠΊΠ°Π·Π°Π½ΠΎ Π²Ρ‹ΡˆΠ΅, для этого Π½Π°ΠΌ ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ subclass класса GraphViewController, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ Π½Π°Π·Π²Π°Π»ΠΈ FavoritesGraphViewController. И Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ MVC Β«Π“Ρ€Π°Ρ„ΠΈΠΊΒ», управляСтся классом FavoritesGraphViewController.
Π’ этом Π½ΠΎΠ²ΠΎΠΌ классС FavoritesGraphViewController для списка ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ ΠΌΡ‹ размСстим Π²Ρ‹Ρ‡ΠΈΡΠ»ΡΠ΅ΠΌΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ favoritePrograms, которая являСтся массивом ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ для RPN ΠΊΠ°Π»ΡŒΠΊΡƒΠ»ΡΡ‚ΠΎΡ€Π° ΠΈ связана с постоянным Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ΠΌ NSUserDefaults. ПополнСниС списка ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ осущСствляСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠ½ΠΎΠΏΠΊΠΈ «Add to Favorites«. К массиву favoritePrograms добавляСтся тСкущая ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° program

Для отобраТСния списка ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π΄Ρ€ΡƒΠ³ΠΎΠΉ MVC β€” MVC «Бписок Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉΒ». Π­Ρ‚ΠΎ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ Table View Controller, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ управляСт класс FavoriteTableViewController. Β«ΠŸΠ΅Ρ€Π΅Π΅Π·Π΄Β» Π½Π° MVC «Бписок Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉΒ» осущСствляСтся ΠΏΡ€ΠΈ Π½Π°ΠΆΠ°Ρ‚ΠΈΠΈ ΠΊΠ½ΠΎΠΏΠΊΠΈ «Show Favorites«, которая находится Π½Π° MVC Β«Π“Ρ€Π°Ρ„ΠΈΠΊΒ», с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ segue Ρ‚ΠΈΠΏΠ° Β«Present as PopoverΒ».

МодСлью для класса FavoriteTableViewController являСтся массив ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ для RPN ΠΊΠ°Π»ΡŒΠΊΡƒΠ»ΡΡ‚ΠΎΡ€Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½ΡƒΠΆΠ½ΠΎ ΠΎΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΡ‚ΡŒ Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅.

ВыполняСм ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Table View DataSource


И сразу ΠΆΠ΅ сталкиваСмся с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒ Π² строкС Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Π½Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ для RPN ΠΊΠ°Π»ΡŒΠΊΡƒΠ»ΡΡ‚ΠΎΡ€Π°, Π° Π΅Π΅ описаниС Π² Β«Ρ†ΠΈΠ²ΠΈΠ»ΠΈΠ·ΠΎΠ²Π°Π½Π½ΠΎΠΌ инфиксном» Π²ΠΈΠ΄Π΅, вСдь наш MVC называСтся MVC «Бписок Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉΒ». Для этого Π½Π°Π΄ΠΎ Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Ρ‚ΡŒ ΠΊΠ°Π»ΡŒΠΊΡƒΠ»ΡΡ‚ΠΎΡ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ находится Π² MVC Β«Π“Ρ€Π°Ρ„ΠΈΠΊΒ».

ДобавляСм Π² класс FavoriteTableViewController ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ-Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ descriptionProgram, Ρ‚ΠΈΠΏ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ β€” функция, ΠΈΠΌΠ΅ΡŽΡ‰Π°Ρ Π½Π° Π²Ρ…ΠΎΠ΄Π΅ Π΄Π²Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°:

  • FavoriteTableViewController β€” класс, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅Ρ‚ этот ΠΌΠ΅Ρ‚ΠΎΠ΄
  • index β€” индСкс ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π² спискС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ favoritePrograms, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π½ΡƒΠΆΠ½ΠΎ инфиксноС описаниС

На Π²Ρ‹Ρ…ΠΎΠ΄Π΅ получаСтся Optional строка c описаниСм:

Π­Ρ‚ΠΎ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ Π² MVC Β«Π“Ρ€Π°Ρ„ΠΈΠΊΒ» Π² процСссС ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠΈ ΠΊ Β«ΠΏΠ΅Ρ€Π΅Π΅Π·Π΄ΡƒΒ» Π½Π° MVC «Бписок Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉΒ» Π² ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ prepareForSegue

Π—Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ descriptionProgram Π·Π°Ρ…Π²Π°Ρ‚ΠΈΡ‚ Π² MVC Β«Π“Ρ€Π°Ρ„ΠΈΠΊΒ» ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ ΠΊΠ°Π»ΡŒΠΊΡƒΠ»ΡΡ‚ΠΎΡ€Π° ΠΈ массив ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡ… ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Π²Ρ‹Π·ΠΎΠ²Π΅.

ВСрнСмся ΠΊ нашСй Ρ‚Π°Π±Π»ΠΈΡ†Π΅ ΠΈ классу FavoriteTableViewController. Нам Π½ΡƒΠΆΠ½ΠΎ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ рисованиС ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ Π³Ρ€Π°Ρ„ΠΈΠΊΠ° ΠΏΡ€ΠΈ Π²Ρ‹Π±ΠΎΡ€Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ ΠΈ ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ строки Π² спискС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ с массивом ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ, находящСмся Π² постоянном Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ NSUserDefaults. ВсС это Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ взаимодСйствия с MVC Β«Π“Ρ€Π°Ρ„ΠΈΠΊΒ» . ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ добавляСм Π² класс FavoriteTableViewController Π΄Π²Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅-замыкания didSelect ΠΈ didDelete, Ρ‚ΠΈΠΏ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… β€” Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ с ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠΉ сигнатурой, ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠ΅ Π½Π° Π²Ρ…ΠΎΠ΄Π΅, ΠΊΠ°ΠΊ ΠΈ прСдыдущая пСрСмСнная-Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ descriptionProgram, Π΄Π²Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°:

  • FavoriteTableViewController β€” класс, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅Ρ‚ этот ΠΌΠ΅Ρ‚ΠΎΠ΄
  • index β€” индСкс ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π² спискС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ favoritePrograms, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π½ΡƒΠΆΠ½ΠΎ инфиксноС описаниС

Π­Ρ‚ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ всС дСйствия производятся Π²Π½ΡƒΡ‚Ρ€ΠΈ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠΉ:

Π‘ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Π΄Π΅Π»Π΅Π³Π°Ρ‚Π° didSelectRowAtIndexPath ΠΈ commitEditingStyle… ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Π½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅-замыкания для выполнСния поставлСнных Π·Π°Π΄Π°Ρ‡:

Замыкания didSelect ΠΈ didDelete ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ Π² MVC Β«Π“Ρ€Π°Ρ„ΠΈΠΊΒ» Π² процСссС ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠΈ ΠΊ ΠΏΠ΅Ρ€Π΅Π΅Π·Π΄Ρƒ Π½Π° MVC «Бписок Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉΒ» Π² ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ prepareForSegue:

Π—Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ didSelect Π·Π°Ρ…Π²Π°Ρ‚ΠΈΡ‚ Π² MVC Β«Π“Ρ€Π°Ρ„ΠΈΠΊΒ» ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ program, которая устанавливаСтся для ΠΊΠ°Π»ΡŒΠΊΡƒΠ»ΡΡ‚ΠΎΡ€Π° ΠΈΠ·Π²Π½Π΅, ΠΈ пСрСустановит Π΅Π΅, Ρ‡Ρ‚ΠΎ заставит MVC Β«Π“Ρ€Π°Ρ„ΠΈΠΊΒ» ΠΏΠ΅Ρ€Π΅Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ Π½ΡƒΠΆΠ½Ρ‹ΠΉ Π½Π°ΠΌ Π³Ρ€Π°Ρ„ΠΈΠΊ. Π’ этом ΠΆΠ΅ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠΈ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΠ±Ρ€Π°Ρ‚ΡŒ Popover ΠΎΠΊΠ½ΠΎ со списком Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ с экрана (достаточно ΡƒΠ±Ρ€Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ со строки controller.dismissControlerAnimated…) ΠΈΠ»ΠΈ ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π΅Π³ΠΎ для ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ Π²Ρ‹Π±ΠΎΡ€Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ.

Π—Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ didDelete Π·Π°Ρ…Π²Π°Ρ‚ΠΈΡ‚ массив ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ favoritePrograms, связанный с постоянным Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ΠΌ NSUserDefaults, ΠΈ удаляСт ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ.
Π˜Ρ‚Π°ΠΊ, ΠΌΡ‹ рассмотрСли ΠΊΠ°ΠΊ MVC «Бписок Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉΒ» взаимодСйствуСт с Π²Ρ‹Π·Π²Π°Π²ΡˆΠΈΠΌ Π΅Π³ΠΎ MVC Β«Π“Ρ€Π°Ρ„ΠΈΠΊΒ» Π² ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΌ Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠΉ.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ рассмотрим прямоС взаимодСйствиС. Π“Π΄Π΅ ΠΆΠ΅ устанавливаСтся МодСль programs для MVC «Бписок Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉΒ»? ΠœΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ Π΅Π΅ Π² MVC Β«Π“Ρ€Π°Ρ„ΠΈΠΊΒ» Π² процСссС ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠΈ ΠΊ ΠΏΠ΅Ρ€Π΅Π΅Π·Π΄Ρƒ Π½Π° MVC «Бписок Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉΒ» Π² Ρ‚ΠΎΠΌ ΠΆΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ prepareForSegue

Π˜Ρ‚Π°ΠΊ, схСма использования Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠΉ для ΠΎΠ±ΠΌΠ΅Π½Π° ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠ΅ΠΉ ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ MVC ΠΎΡ‡Π΅Π½ΡŒ простая.
Она состоит ΠΈΠ· 3-Ρ… шагов:

  • Π’ MVC, Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‰ΠΈΠΌ взаимодСйствия, создаСтС public ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ β€” Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅
  • Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ Π΅Π΅ Π² Ρ‚ΠΎΠΌ ΠΆΠ΅ MVC
  • Π’ Π΄Ρ€ΡƒΠ³ΠΎΠΌ MVC устанавливаСтС это Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ Π»ΠΈΠ±ΠΎ Π² ΠΠ°Π±Π»ΡŽΠ΄Π°Ρ‚Π΅Π»Π΅ Бвойств didSet {}, Π»ΠΈΠ±ΠΎ Π² ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ prepareForSegue, Π»ΠΈΠ±ΠΎ Π΅Ρ‰Π΅ Π³Π΄Π΅-Ρ‚ΠΎ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ Β«Π·Π°Ρ…Π²Π°Ρ‚ΠΈΠ»ΠΎΒ» Π½ΡƒΠΆΠ½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΈ константы

ВсС.
Никаких Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… элСмСнтов β€” ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»ΠΎΠ² ΠΈ Π΄Π΅Π»Π΅Π³Π°Ρ‚ΠΎΠ².

Код на Github.

На iPhone использованиС ГрафичСского ΠΊΠ°Π»ΡŒΠΊΡƒΠ»ΡΡ‚ΠΎΡ€Π° Π΅Ρ‰Π΅ эффСктивнСС, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Ρ‚Π°ΠΌ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π½Π΅ Split View Controller, Π° Navigation Controller, ΠΈ Π²Ρ‹ ΠΎΡΡ‚Π°Π΅Ρ‚Π΅ΡΡŒ ΠΎΠ΄ΠΈΠ½ Π½Π° ΠΎΠ΄ΠΈΠ½ со списком Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π½Π° экранС.

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅


ΠœΡ‹ рассмотрСли ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎΡ‚ ΠΎΠ΄Π½ΠΎΠ³ΠΎ MVC ΠΊ Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ MVC ΠΊΠ°ΠΊ Π² прямом, Ρ‚Π°ΠΊ ΠΈ Π² ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΌ Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠΈ. ΠŸΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ Π² прямом Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠΈ ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π΅ ΠΎΡ‚ ΠΎΠ΄Π½ΠΎΠ³ΠΎ MVC ΠΊ ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌΡƒ, осущСствляСтся установкой MΠΎΠ΄Π΅Π»ΠΈ Ρ‚ΠΎΠ³ΠΎ MVC, ΠΊΡƒΠ΄Π° ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΠΌ. ΠŸΠ΅Ρ€Π΅Π΄Π°Ρ‡Ρƒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ Β«Π½Π°Π·Π°Π΄Β» ΠΈΠ· Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ MVC Π² ΠΏΡ€Π΅Π΄ΡˆΠ΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ MVC ΠΎΡ‡Π΅Π½ΡŒ ΡƒΠ΄ΠΎΠ±Π½ΠΎ ΠΈ Π»Π΅Π³ΠΊΠΎ ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡ‚ΡŒ Π² Swift с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠΉ.

Π­Ρ‚ΠΎΡ‚ ΠΏΡ€ΠΈΠ΅ΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Ρ‚Π°ΠΊΠΆΠ΅ ΠΈ Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ MVC для β€œΡΠ»Π΅ΠΏΠΎΠ³ΠΎ взаимодСйствия” ΠΌΠ΅ΠΆΠ΄Ρƒ View ΠΈ Controller. ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²Π»Π΅Π½ дСмонстрационный ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ГрафичСский ΠšΠ°Π»ΡŒΠΊΡƒΠ»ΡΡ‚ΠΎΡ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ всС эти возмоТности.

ΠžΠ±Ρ€Π°Ρ‰Π°ΡŽ вашС Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ условиСм Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ГрафичСского ΠΊΠ°Π»ΡŒΠΊΡƒΠ»ΡΡ‚ΠΎΡ€Π° Π² стэнфордских курсах Π±Ρ‹Π»ΠΎ созданиС классов, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‰ΠΈΡ… построСния Π³Ρ€Π°Ρ„ΠΈΠΊΠ° ΠΈ Π²Ρ‹Π²ΠΎΠ΄ списка Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π² Ρ‚Π°Π±Π»ΠΈΡ‡Π½ΠΎΠΌ Π²ΠΈΠ΄Π΅, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ Π±ΠΎΠ»Π΅Π΅ ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½Π½Ρ‹ΠΌΠΈ (generic), Π½Π΅ Π·Π½Π°ΡŽΡ‰ΠΈΠΌΠΈ Π½ΠΈΡ‡Π΅Π³ΠΎ ΠΎ сущСствовании RPN ΠΊΠ°Π»ΡŒΠΊΡƒΠ»ΡΡ‚ΠΎΡ€Π°. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ всС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ β€” замыкания Π²ΠΎ всСх прСдставлСнных ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ… ΠΈΠΌΠ΅ΡŽΡ‚ ΠΎΡ‡Π΅Π½ΡŒ ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½Π½Ρ‹ΠΉ (generic) Π²ΠΈΠ΄, связанный ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ с сСмантикой ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… классов GraphView ΠΈ FavoriteTableViewController.

Бсылки


Бтэнфордский курс 2015 Β«Developing iOS 8 Apps with Swift» 
Русский Π½Π΅Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ конспСкт Π»Π΅ΠΊΡ†ΠΈΠΉ ΠΈ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π—Π°Π΄Π°Π½ΠΈΠΉ находятся Π½Π° сайтС Β«Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° iOS+Swift+Objective-C ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉΒ»
ВСкст Задания 3 Π½Π° английском языкС доступСн Π½Π° iTunes Π² ΠΏΡƒΠ½ΠΊΡ‚Π΅ β€œDeveloping iOS 8 app: Programming: Project 3β€³.
ВСкст Задания 3 Π½Π° русском языкС доступСн Π½Π° Β«Π—Π°Π΄Π°Π½ΠΈΠ΅ 3 iOS 8.pdfΒ»

РСшСниС Задания 3 «ГрафичСский ΠΊΠ°Π»ΡŒΠΊΡƒΠ»ΡΡ‚ΠΎΡ€Β» с нуля.
Π—Π°Π΄Π°Π½ΠΈΠ΅ 3 cs193p Π—ΠΈΠΌΠ° 2015 ГрафичСский ΠšΠ°Π»ΡŒΠΊΡƒΠ»ΡΡ‚ΠΎΡ€. РСшСниС β€” ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΏΡƒΠ½ΠΊΡ‚Ρ‹
Π—Π°Π΄Π°Π½ΠΈΠ΅ 3 cs193p Π—ΠΈΠΌΠ° 2015 ГрафичСский ΠšΠ°Π»ΡŒΠΊΡƒΠ»ΡΡ‚ΠΎΡ€. РСшСниС β€” Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΏΡƒΠ½ΠΊΡ‚Ρ‹ 1, 2 ΠΈ 3
Π—Π°Π΄Π°Π½ΠΈΠ΅ 3. РСшСниС β€” Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΏΡƒΠ½ΠΊΡ‚Ρ‹ 4, 5 ΠΈ 6. ΠžΠΊΠΎΠ½Ρ‡Π°Π½ΠΈΠ΅.
Код на Github.
ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅. Если Π±ΡƒΠ΄Π΅Ρ‚Π΅ ΡΠΊΡΠΏΠ΅Ρ€ΠΈΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ с ГрафичСским ΠΊΠ°Π»ΡŒΠΊΡƒΠ»ΡΡ‚ΠΎΡ€ΠΎΠΌ, Ρ‚ΠΎ ΠΏΠΎΠΌΠ½ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ это RPN ΠΊΠ°Π»ΡŒΠΊΡƒΠ»ΡΡ‚ΠΎΡ€, поэтому сначала вводятся ΠΎΠΏΠ΅Ρ€Π°Π½Π΄Ρ‹, Π° ΠΏΠΎΡ‚ΠΎΠΌ опСрация. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ sin (1/M) Π½ΡƒΠΆΠ½ΠΎ ввСсти Π½Π° ΠΊΠ°Π»ΡŒΠΊΡƒΠ»ΡΡ‚ΠΎΡ€Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ символов
1 ↡ M Γ· sin ΠΊΠ½ΠΎΠΏΠΊΠ° Β«Π“Ρ€Π°Ρ„ΠΈΠΊΒ» Π΄Π°Π΅Ρ‚ sin (1/M)
M cos M Γ— ΠΊΠ½ΠΎΠΏΠΊΠ° Β«Π“Ρ€Π°Ρ„ΠΈΠΊΒ» Π΄Π°Π΅Ρ‚ cos(M)*M
M ↡ 1 ↡ M sin + Γ— ΠΊΠ½ΠΎΠΏΠΊΠ° Β«Π“Ρ€Π°Ρ„ΠΈΠΊΒ» Π΄Π°Π΅Ρ‚ M * ( 1 +sin (M))

Leave a comment