Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ

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

17 ноября 2022

Β 

Π’Ρ‹ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚Π΅ эту ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ, опрСдСляя ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ схоТи со ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ для создания экзСмпляра ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°. Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠΈ ΠΎΡ‚ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠ² Π² Objective-C, ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Ρ‹ Π² Swift Π½Π΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ значСния. Основная Ρ€ΠΎΠ»ΡŒ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠ² - ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π½ΠΎΠ²Ρ‹ΠΉ экзСмпляр Ρ‚ΠΈΠΏΠ° ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½ Π΄ΠΎ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π±ΡƒΠ΄Π΅Ρ‚ использован Π² ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Ρ€Π°Π·.

ЭкзСмпляры классовых Ρ‚ΠΈΠΏΠΎΠ² Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠ³ΡƒΡ‚ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ Π΄Π΅ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ проводят Π»ΡŽΠ±ΡƒΡŽ чистку прямо ΠΏΠ΅Ρ€Π΅Π΄ Ρ‚Π΅ΠΌ, ΠΊΠ°ΠΊ экзСмпляр класса Π±ΡƒΠ΄Π΅Ρ‚ освобоТдСн. Для Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ Ρ‡ΠΈΡ‚Π°ΠΉΡ‚Π΅ ДСинициализация.

Установка Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ для свойств хранСния

ΠšΠ»Π°ΡΡΡ‹ ΠΈ структуры Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹Π΅ значСния Ρƒ всСх свойств хранСния Π²ΠΎ врСмя создания класса ΠΈΠ»ΠΈ структуры. Бвойства хранСния Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ оставлСны Π² Π½Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½ΠΎΠΌ состоянии.

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ свойства Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° ΠΈΠ»ΠΈ ΠΏΡ€ΠΈΡΠ²ΠΎΠΈΡ‚ΡŒ Π΅ΠΌΡƒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, ΠΊΠ°ΠΊ Ρ‡Π°ΡΡ‚ΡŒ опрСдСлСния свойства. Π­Ρ‚ΠΈ дСйствия Π±ΡƒΠ΄ΡƒΡ‚ описаны ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… сСкциях.

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

Когда Π²Ρ‹ присваиваСтС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ свойству хранСния ΠΈΠ»ΠΈ устанавливаСтС исходноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π΅, Ρ‚ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ устанавливаСтся Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ, Π±Π΅Π· Π²Ρ‹Π·ΠΎΠ²Π° Π½Π°Π±Π»ΡŽΠ΄Π°Ρ‚Π΅Π»Π΅ΠΉ.

Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Ρ‹

Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Ρ‹ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ для создания Π½ΠΎΠ²ΠΎΠ³ΠΎ экзСмпляра ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°. Π’ самой простой своСй Ρ„ΠΎΡ€ΠΌΠ΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΊΠ°ΠΊ ΠΌΠ΅Ρ‚ΠΎΠ΄ экзСмпляра Π±Π΅Π· ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ², написанный с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ слова init:


init() {
    // инициализация проводится Ρ‚ΡƒΡ‚
}

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π½ΠΈΠΆΠ΅ опрСдСляСт Π½ΠΎΠ²ΡƒΡŽ структуру Fahrenheit для хранСния Ρ‚Π΅ΠΌΠΏΠ΅Ρ€Π°Ρ‚ΡƒΡ€, прСдставлСнных Π² Π€Π°Ρ€Π΅Π½Π³Π΅ΠΉΡ‚Π°Ρ…. Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° Fahrenheit ΠΈΠΌΠ΅Π΅Ρ‚ всСго одно свойство, temperature Ρ‚ΠΈΠΏΠ° Double:


struct Fahrenheit {
    var temperature: Double
    init() {
        temperature = 32.0
    }
}
var f = Fahrenheit()
print("Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚Π΅ΠΌΠΏΠ΅Ρ€Π°Ρ‚ΡƒΡ€Ρ‹ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ \(f.temperature)Β° ΠΏΠΎ Π€Π°Ρ€Π΅Π½Π³Π΅ΠΉΡ‚Ρƒ")
// Π’Ρ‹Π²Π΅Π΄Π΅Ρ‚ "Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚Π΅ΠΌΠΏΠ΅Ρ€Π°Ρ‚ΡƒΡ€Ρ‹ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ 32.0Β° ΠΏΠΎ Π€Π°Ρ€Π΅Π½Π³Π΅ΠΉΡ‚Ρƒ"

Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° опрСдСляСт ΠΎΠ΄ΠΈΠ½ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€, init, Π±Π΅Π· ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ Ρ…Ρ€Π°Π½ΠΈΠΌΡƒΡŽ Ρ‚Π΅ΠΌΠΏΠ΅Ρ€Π°Ρ‚ΡƒΡ€Ρƒ Ρ€Π°Π²Π½ΡƒΡŽ 32.0Β (Ρ‚Π΅ΠΌΠΏΠ΅Ρ€Π°Ρ‚ΡƒΡ€Π° замСрзания Π²ΠΎΠ΄Ρ‹ ΠΏΠΎ Π€Π°Ρ€Π΅Π½Π³Π΅ΠΉΡ‚Ρƒ).

Π”Π΅Ρ„ΠΎΠ»Ρ‚Π½Ρ‹Π΅ значСния свойств

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ исходноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ свойства Π² ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π΅, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π²Ρ‹ΡˆΠ΅. Π’Π°ΠΊ ΠΆΠ΅ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ свойства ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, ΠΊΠ°ΠΊ Ρ‡Π°ΡΡ‚ΡŒ опрСдСлСния свойства. Π’Ρ‹ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ свойства ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, написав исходноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ свойства, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎ.

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

Если свойство ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· Π±Π΅Ρ€Π΅Ρ‚ ΠΎΠ΄Π½ΠΎ ΠΈ Ρ‚ΠΎ ΠΆΠ΅ исходноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Ρ‚ΠΎ Π»ΡƒΡ‡ΡˆΠ΅ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ это Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π² качСствС значСния ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, Ρ‡Π΅ΠΌ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ Π² ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π΅. ΠšΠΎΠ½Π΅Ρ‡Π½Ρ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Ρ‚Π°ΠΊΠΎΠΉ ΠΆΠ΅, Π½ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ связываСт ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ свойства Π±Π»ΠΈΠΆΠ΅ ΠΊ своСму объявлСнию. Π’Π°ΠΊ Π΄Π΅Π»Π°ΡŽΡ‚, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Ρ‹ Π² Π±ΠΎΠ»Π΅Π΅ чистой ΠΈ ΠΊΡ€Π°Ρ‚ΠΊΠΎΠΉ Ρ„ΠΎΡ€ΠΌΠ΅, ΠΈ это позволяСт Π²Π°ΠΌ вывСсти Ρ‚ΠΈΠΏ свойства ΠΈΠ· Π΅Π³ΠΎ значСния ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ. ЗначСния ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Ρ‚Π°ΠΊ ΠΆΠ΅ Π΄Π°ΡŽΡ‚ Π²Π°ΠΌ большС прСимущСств для использования ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠ² ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΈΠ»ΠΈ наслСдования ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°, Ρ‡Ρ‚ΠΎ описано ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ Π΄Π°Π»Π΅Π΅ Π² этой Π³Π»Π°Π²Π΅.

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ структуру Fahrenheit Π² Π±ΠΎΠ»Π΅Π΅ простой Ρ„ΠΎΡ€ΠΌΠ΅, ΡƒΠΊΠ°Π·Π°Π² Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ для свойства temperature, Π² мСстС Π΅Π³ΠΎ объявлСния:


struct Fahrenheit {
  var temperature = 32.0
}

Настройка ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ процСсс ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π²Ρ…ΠΎΠ΄Π½Ρ‹ΠΌΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ ΠΈ ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΌΠΈ типами свойств или присваиваниСм Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ для постоянных свойств Π²ΠΎ врСмя ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ, Ρ‡Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ описано Π΄Π°Π»Π΅Π΅.

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΊΠ°ΠΊ Ρ‡Π°ΡΡ‚ΡŒ опрСдСлСния ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°, для опрСдСлСния Ρ‚ΠΈΠΏΠΎΠ² ΠΈ ΠΈΠΌΠ΅Π½ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π°ΡΡ‚Ρ€Π°ΠΈΠ²Π°ΡŽΡ‚ процСсс ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ. ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈΠΌΠ΅ΡŽΡ‚ Ρ‚Π΅ ΠΆΠ΅ возмоТности ΠΈ синтаксис ΠΊΠ°ΠΊ ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠ»ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°.

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ опрСдСляСт структуру Celsius, которая Ρ…Ρ€Π°Π½ΠΈΡ‚ Ρ‚Π΅ΠΌΠΏΠ΅Ρ€Π°Ρ‚ΡƒΡ€Ρƒ Π² Π¦Π΅Π»ΡŒΡΠΈΡΡ…. Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° Celsius Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ Π΄Π²Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° init(fromFahrenheit: ) ΠΈ init(fromKelvin: ), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ Π½ΠΎΠ²Ρ‹ΠΉ экзСмпляр структуры со Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ Π΄Ρ€ΡƒΠ³ΠΎΠΉ Ρ‚Π΅ΠΌΠΏΠ΅Ρ€Π°Ρ‚ΡƒΡ€Π½ΠΎΠΉ ΡˆΠΊΠ°Π»Ρ‹:


struct Celsius {
    var temperatureInCelsius: Double
    init(fromFahrenheit fahrenheit: Double) {
        temperatureInCelsius = (fahrenheit - 32.0) / 1.8
    }
    init(fromKelvin kelvin: Double) {
        temperatureInCelsius = kelvin - 273.15
    }
}
let boilingPointOfWater = Celsius(fromFahrenheit: 212.0)
// boilingPointOfWater.temperatureInCelsius is 100.0
let freezingPointOfWater = Celsius(fromKelvin: 273.15)
// freezingPointOfWater.temperatureInCelsius is 0.0

ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ ΠΈΠΌΠ΅Π΅Ρ‚ ΠΎΠ΄ΠΈΠ½ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ с внСшним ΠΈΠΌΠ΅Π½Π΅ΠΌ fromFahrenheit ΠΈ с Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ fahrenheit. Π’Ρ‚ΠΎΡ€ΠΎΠΉ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ ΠΈΠΌΠ΅Π΅Ρ‚ ΠΎΠ΄ΠΈΠ½ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ с внСшним ΠΈΠΌΠ΅Π½Π΅ΠΌ fromKelvin ΠΈ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ kelvin. Оба ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° ΠΊΠΎΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΡƒΡŽΡ‚ ΠΈΡ… СдинствСнный Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ Π² Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ ЦСльсию ΠΈ ΡΠΎΡ…Ρ€Π°Π½ΡΡŽΡ‚ это Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² свойство temperatureInCelsius.

Π›ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΈ внСшниС ΠΈΠΌΠ΅Π½Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ²

Как ΠΈ Π² случаС с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈΠ»ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ², ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΈΠΌΠ΅Π½Π° для использования Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ‚Π΅Π»Π° ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° ΠΈ внСшниС для использования ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°.

Однако ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Ρ‹ Π½Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ своСго ΠΈΠΌΠ΅Π½ΠΈ Π΄ΠΎ ΠΊΡ€ΡƒΠ³Π»Ρ‹Ρ… скобок, ΠΊΠ°ΠΊ это ΠΈΠΌΠ΅ΡŽΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΈΠ»ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΈΠΌΠ΅Π½Π° ΠΈ Ρ‚ΠΈΠΏΡ‹ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° ΠΈΠ³Ρ€Π°ΡŽΡ‚ Π²Π°ΠΆΠ½ΡƒΡŽ Ρ€ΠΎΠ»ΡŒ Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊΠΎΠΉ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ ΠΈ Π³Π΄Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ использован. Из-Π·Π° этого Swift прСдоставляСт автоматичСскиС внСшниС ΠΈΠΌΠ΅Π½Π° для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°, Ссли Π²Ρ‹, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, Π½Π΅ ΡƒΠΊΠ°ΠΆΠ΅Ρ‚Π΅ своС внСшнСС имя.

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ опрСдСляСт структуру Color с трСмя постоянными свойствами red, green, blue. Π­Ρ‚ΠΈ свойства ΠΈΠΌΠ΅ΡŽΡ‚ значСния ΠΎΡ‚ 0.0 Π΄ΠΎ 1.0, для ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ†ΠΈΠΈ количСства ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ Ρ†Π²Π΅Ρ‚Π°.

Color ΠΈΠΌΠ΅Π΅Ρ‚ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ с трСмя ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ red, green, blue Ρ‚ΠΈΠΏΠ° Double(ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ Ρ†Π²Π΅Ρ‚Π° красного, Π·Π΅Π»Π΅Π½ΠΎΠ³ΠΎ, синСго). Π’Π°ΠΊΠΆΠ΅ Color ΠΈΠΌΠ΅Π΅Ρ‚ Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ с ΠΎΠ΄Π½ΠΈΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ white, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½ΡƒΠΆΠ΅Π½ для прСдоставлСния значСния для всСх Ρ‚Ρ€Π΅Ρ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² Ρ†Π²Π΅Ρ‚Π°.


struct Color {
    let red, green, blue: Double
    init(red: Double, green: Double, blue: Double) {
        self.red   = red
        self.green = green
        self.blue  = blue
    }
    init(white: Double) {
        red   = white
        green = white
        blue  = white
    }
}

Оба ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Ρ‹ для создания Π½ΠΎΠ²ΠΎΠ³ΠΎ экзСмпляра Color, ΠΏΠ΅Ρ€Π΅Π΄Π°Π² значСния Π² ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°:


let magenta = Color(red: 1.0, green: 0.0, blue: 1.0)
let halfGray = Color(white: 0.5)

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ Π±Π΅Π· использования Π²Π½Π΅ΡˆΠ½ΠΈΡ… ΠΈΠΌΠ΅Π½. Π’Π½Π΅ΡˆΠ½ΠΈΠ΅ ΠΈΠΌΠ΅Π½Π° ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Ρ‹ Π² ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π΅, Ссли ΠΎΠ½ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹, Ссли ΠΏΡ€ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΈΡ…, Ρ‚ΠΎ выскочит ошибка компиляции:


let veryGreen = Color(0.0, 1.0, 0.0)
// этот ΠΊΠΎΠ΄ Π²Ρ‹Π·ΠΎΠ²Π΅Ρ‚ ΠΎΡˆΠΈΠ±ΠΊΡƒ компиляции, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ здСсь Π½Π΅Ρ‚ Π²Π½Π΅ΡˆΠ½ΠΈΡ… ΠΈΠΌΠ΅Π½

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° Π±Π΅Π· Π²Π½Π΅ΡˆΠ½ΠΈΡ… ΠΈΠΌΠ΅Π½

Если Π²Ρ‹ Π½Π΅ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ внСшниС ΠΈΠΌΠ΅Π½Π° для ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ, Π½Π°ΠΏΠΈΡˆΠΈΡ‚Π΅ ΠΏΠΎΠ΄Ρ‡Π΅Ρ€ΠΊΠΈΠ²Π°Π½ΠΈΠ΅ (_) вмСсто явного указания внСшнСго ΠΈΠΌΠ΅Π½ΠΈ для этого ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ.

Π’ΠΎΡ‚ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½Ρ‹ΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ для Celsius, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ рассматривали Ρ€Π°Π½Π΅Π΅, с Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠΌ, для создания Π½ΠΎΠ²ΠΎΠ³ΠΎ экзСмпляра Celsius с Ρ‚ΠΈΠΏΠΎΠΌ значСния Ρ‚Π΅ΠΌΠΏΠ΅Ρ€Π°Ρ‚ΡƒΡ€Ρ‹ Double Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΡƒΠΆΠ΅ ΠΏΠΎ шкалС ЦСльсия:


struct Celsius {
    var temperatureInCelsius: Double
    init(fromFahrenheit fahrenheit: Double) {
        temperatureInCelsius = (fahrenheit - 32.0) / 1.8
    }
    init(fromKelvin kelvin: Double) {
        temperatureInCelsius = kelvin - 273.15
    }
    init(_ celsius: Double) {
        temperatureInCelsius = celsius
    }
}
let bodyTemperature = Celsius(37.0)
// bodyTemperature.temperatureInCelsius is 37.0

Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Celsius(37.0), Ρ‡Ρ‚ΠΎ понятно ΠΈ Π±Π΅Π· внСшнСго ΠΈΠΌΠ΅Π½ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ цСлСсообразно Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ init(_ celsius: Double), для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ бСзымянноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° Double.

ΠžΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹ свойств

Если ваш ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ Ρ‚ΠΈΠΏ ΠΈΠΌΠ΅Π΅Ρ‚ свойство, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ логичСски ΠΈΠΌΠ΅Π΅Ρ‚ β€œΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΠΈΠ΅ значСния”, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ Π΅Π³ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ установлСно Π²ΠΎ врСмя ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈΠ»ΠΈ ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ Π΅ΠΌΡƒ Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅Ρ‚ΡΡ ΠΈΠΌΠ΅Ρ‚ΡŒ β€œΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΠΈΠ΅ значСния” Π² ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ Ρ‚ΠΎΡ‡ΠΊΠ΅ ΠΊΠΎΠ΄Π°, Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ свойство Π½ΡƒΠΆΠ½ΠΎ ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ с ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΌ Ρ‚ΠΈΠΏΠΎΠΌ. Бвойства ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° автоматичСски ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ΡΡ со Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ nil, указывая Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ стрСмится ΠΈΠΌΠ΅Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ β€œΠΏΠΎΠΊΠ° Ρ‡Ρ‚ΠΎ отсутствиС значСниС” Π½Π° этапС ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ.

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄ опрСдСляСт класс SurveyQuestion с ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΌ Ρ‚ΠΈΠΏΠΎΠΌ String свойства response:


class SurveyQuestion {
    var text: String
    var response: String?
    init(text: String) {
        self.text = text
    }
    func ask() {
        print(text)
    }
}
let cheeseQuestion = SurveyQuestion(text: "Нравится Π»ΠΈ Π²Π°ΠΌ сыр?")
cheeseQuestion.ask()
// Π’Ρ‹Π²Π΅Π΄Π΅Ρ‚ "Нравится Π»ΠΈ Π²Π°ΠΌ сыр?"
cheeseQuestion.response = "Π”Π°, я люблю сыр"

ΠžΡ‚Π²Π΅Ρ‚ Π½Π° вопрос Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ извСстСн Π΄ΠΎ Ρ‚ΠΎΠ³ΠΎ, ΠΏΠΎΠΊΠ° ΠΎΠ½ Π½Π΅ Π·Π°Π΄Π°Π½, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ свойство response Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Ρ‚ΠΈΠΏΠ° String? (ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ String). Π•ΠΌΡƒ автоматичСски присваиваСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ nil ΠΏΡ€ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ SurveyQuestion, Π·Π½Π°Ρ‡Π°Ρ‰Π΅Π΅, Ρ‡Ρ‚ΠΎ β€œΠ·Π½Π°Ρ‡Π΅Π½ΠΈΡ ΠΏΠΎΠΊΠ° нСт”.

ΠŸΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°Π½ΠΈΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ постоянным свойствам Π²ΠΎ врСмя ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΡ€ΠΈΡΠ²ΠΎΠΈΡ‚ΡŒ значСния постоянных (ΠΊΠΎΠ³Π΄Π° свойство константа) свойств Π² любой Ρ‚ΠΎΡ‡ΠΊΠ΅ вашСго процСсса ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ. Как Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для свойства константы присваиваСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΎΠ½ΠΎ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π΄Π°Π»Π΅Π΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΎ.

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

Π’ экзСмплярах класса постоянноС свойство ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²ΠΎ врСмя ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ класса, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΎΠ½ΠΎ прСдставлСно. Оно Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΎ подклассом.

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠ΅Ρ€Π΅ΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ SurveyQuestion ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ вмСсто ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ свойства text постоянноС свойство text, для ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ†ΠΈΠΈ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ это свойство Π½Π΅ мСняСтся послС создания SurveyQuestion. Π”Π°ΠΆΠ΅ Ссли свойство являСтся постоянным, ΠΎΠ½ΠΎ всС Π΅Ρ‰Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ установлСно Π² ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π΅ класса:


class SurveyQuestion {
  let text: String
  var response: String?
  init(text: String) {
    self.text = text
  }
  func ask() {
    print(text)
  }
}
let beetsQuestion = SurveyQuestion(text: "Π§Ρ‚ΠΎ насчСт свСклы?")
beetsQuestion.ask()
// Π’Ρ‹Π²Π΅Π΄Π΅Ρ‚ "Π§Ρ‚ΠΎ насчСт свСклы?"
beetsQuestion.response = "Π― люблю свСклу, Π½ΠΎ Π½Π΅ Π² сыром Π²ΠΈΠ΄Π΅!"

Π”Π΅Ρ„ΠΎΠ»Ρ‚Π½Ρ‹Π΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Ρ‹

Swift прСдоставляСт Π΄Π΅Ρ„ΠΎΠ»Ρ‚Π½Ρ‹ΠΉ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ для любой структуры ΠΈΠ»ΠΈ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΠΌΠ΅Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ для всСх Π΅Π³ΠΎ свойств ΠΈ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ Π½ΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°. Π”Π΅Ρ„ΠΎΠ»Ρ‚Π½Ρ‹ΠΉ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ просто создаСт Π½ΠΎΠ²Ρ‹ΠΉ экзСмпляр со всСми Π΅Π³ΠΎ свойствами с ΡƒΠΆΠ΅ присвоСнными значСниями ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ.

Π­Ρ‚ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ опрСдСляСт класс ShoppingListItem, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π² сСбя имя, количСство ΠΈ состояниС сдСлки Π½Π° ΠΏΡ€Π΅Π΄ΠΌΠ΅Ρ‚ ΠΈΠ· листа ΠΏΠΎΠΊΡƒΠΏΠΎΠΊ:


class ShoppingListItem {
    var name: String?
    var quantity = 1
    var purchased = false
}
var item = ShoppingListItem()

Π’Π°ΠΊ ΠΊΠ°ΠΊ всС свойства класса ShoppingListItem ΠΈΠΌΠ΅ΡŽΡ‚ значСния ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΈ Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ этот класс Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ супСркласса, Ρ‚ΠΎ ShoppingListItem автоматичСски ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ Π΄Π΅Ρ„ΠΎΠ»Ρ‚Π½ΠΎΠ³ΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ создаСт Π½ΠΎΠ²Ρ‹ΠΉ экзСмпляр со всСми свойствами с ΡƒΠΆΠ΅ присвоСнными значСниями ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ. (Бвойство name - свойство ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° String, Π·Π½Π°Ρ‡ΠΈΡ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Ρ€Π°Π²Π½ΠΎ nil). Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π²Ρ‹ΡˆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π΄Π΅Ρ„ΠΎΠ»Ρ‚Π½Ρ‹ΠΉ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ для класса ShoppingListItem для создания Π½ΠΎΠ²ΠΎΠ³ΠΎ экзСмпляра. Бинтаксис Π΄Π΅Ρ„ΠΎΠ»Ρ‚Π½ΠΎΠ³ΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° Π² нашСм случаС выглядит ΠΊΠ°ΠΊ ShoppingListItem(), Ρ‡Ρ‚ΠΎ присваиваСтся ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ item.

ΠŸΠΎΡ‡Π»Π΅Π½Π½Ρ‹Π΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Ρ‹ структурных Ρ‚ΠΈΠΏΠΎΠ²

Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹ автоматичСски ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‚ ΠΏΠΎΡ‡Π»Π΅Π½Π½Ρ‹ΠΉ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€, Ссли ΠΎΠ½ΠΈ Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ своСго ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°. Π­Ρ‚ΠΎ Π²Π΅Ρ€Π½ΠΎ Π΄Π°ΠΆΠ΅ ΠΏΡ€ΠΈ условии, Ρ‡Ρ‚ΠΎ Ρ…Ρ€Π°Π½ΠΈΠΌΡ‹Π΅ свойства Π½Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ.

ΠŸΠΎΡ‡Π»Π΅Π½Π½Ρ‹ΠΉ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ - сокращСнный способ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ свойства Ρ‡Π»Π΅Π½Π° Π½ΠΎΠ²ΠΎΠ³ΠΎ экзСмпляра структуры. ΠΠ°Ρ‡Π°Π»ΡŒΠ½Ρ‹Π΅ значСния для свойств Π½ΠΎΠ²ΠΎΠ³ΠΎ экзСмпляра ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Ρ‹ Π² ΠΏΠΎΡ‡Π»Π΅Π½Π½Ρ‹ΠΉ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π½ΠΈΠΆΠ΅ опрСдСляСт структуру Size с двумя свойствами width, height. Оба свойства Π²Ρ‹Π²Π΅Π΄Π΅Π½Ρ‹ ΠΊΠ°ΠΊ Double ΠΈΠ·-Π·Π° Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ значСния Ρ€Π°Π²Π½ΠΎΠ³ΠΎ 0.0.

Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° Size автоматичСски ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ init(width:height: ) ΠΏΠΎΡ‡Π»Π΅Π½Π½Ρ‹ΠΉ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Size экзСмпляра:


struct Size {
    var width = 0.0, height = 0.0
}
let twoByTwo = Size(width: 2.0, height: 2.0)

Π”Π΅Π»Π΅Π³ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° для Ρ‚ΠΈΠΏΠΎΠ² значСния

Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Ρ‹ для ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ части экзСмпляра. Π­Ρ‚ΠΎΡ‚ процСсс называСтся ΠΊΠ°ΠΊ Π΄Π΅Π»Π΅Π³ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°. Он позволяСт ΠΈΠ·Π±Π΅Π³Π°Ρ‚ΡŒ дублирования ΠΊΠΎΠ΄Π° Π² Ρ€Π°Π·Π½Ρ‹Ρ… ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°Ρ….

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

Для Ρ‚ΠΈΠΏΠΎΠ² Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ self.init для ссылки Π½Π° ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Ρ‹ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ Ρ‚ΠΈΠΏΠ° значСния, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ ΠΏΠΈΡˆΠ΅Ρ‚Π΅ свои ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Ρ‹. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ self.init ΠΈΠ· ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°.

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

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

Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ваш ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ Ρ‚ΠΈΠΏ значСния ΠΈΠΌΠ΅Π» Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π±Ρ‹Ρ‚ΡŒ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ Π΄Π΅Ρ„ΠΎΠ»Ρ‚Π½Ρ‹ΠΌ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠΌΒ ΠΈΠ»ΠΈ ΠΏΠΎΡ‡Π»Π΅Π½Π½Ρ‹ΠΌ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠΌ, ΠΈΠ»ΠΈ вашим ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΌ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠΌ, Ρ‚ΠΎ Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ свой ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ Π² Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠΈ вашСго Ρ‚ΠΈΠΏΠ°, Ρ‡Π΅ΠΌ ΠΊΠ°ΠΊ Ρ‡Π°ΡΡ‚ΡŒ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ‚ΠΈΠΏΠ° значСния. Для Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ смотритС Π Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ.

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ опрСдСляСт ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΡƒΡŽ структуру Rect для отобраТСния гСомСтричСского ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°. ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρƒ Π½ΡƒΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π΄Π²Π΅ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ структуры Size, Point, каТдая ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… прСдоставляСт значСния ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ 0.0 для своих свойств:


struct Size {
    var width = 0.0, height = 0.0
}
struct Point {
    var x = 0.0, y = 0.0
}

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ структуру Rect трСмя способами: ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ свою Π½ΡƒΠ»Π΅Π²ΡƒΡŽ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ свойств origin ΠΈ size, прСдоставляя ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΡƒΡŽ Ρ‚ΠΎΡ‡ΠΊΡƒ ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€, ΠΈΠ»ΠΈ прСдоставляя Ρ‚ΠΎΡ‡ΠΊΡƒ Ρ†Π΅Π½Ρ‚Ρ€Π° ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€. Π­Ρ‚ΠΈ ΠΎΠΏΡ†ΠΈΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ прСдставлСны трСмя ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°ΠΌΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ Ρ‡Π°ΡΡ‚ΡŒΡŽ опрСдСлСния структуры Rect:


struct Rect {
    var origin = Point()
    var size = Size()
    init() {}
    init(origin: Point, size: Size) {
        self.origin = origin
        self.size = size
    }
    init(center: Point, size: Size) {
        let originX = center.x - (size.width / 2)
        let originY = center.y - (size.height / 2)
        self.init(origin: Point(x: originX, y: originY), size: size)
    }
}

ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ Rect - init() Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎ Ρ‚ΠΎΡ‚ ΠΆΠ΅ самый, Ρ‡Ρ‚ΠΎ ΠΈ Π΄Π΅Ρ„ΠΎΠ»Ρ‚Π½Ρ‹ΠΉ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»Π° структура, Ссли Π±Ρ‹ Π½Π΅ ΠΈΠΌΠ΅Π»Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠ². Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ ΠΈΠΌΠ΅Π΅Ρ‚ пустоС Ρ‚Π΅Π»ΠΎ, ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½Π½ΠΎΠ΅ ΠΏΠ°Ρ€ΠΎΠΉ пустых Ρ„ΠΈΠ³ΡƒΡ€Π½Ρ‹Ρ… скобок {}, ΠΈ Π½Π΅ ΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΈΡ‚ Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ. Вызывая Ρ‚Π°ΠΊΠΎΠΉ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€, ΠΌΡ‹ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ экзСмпляр Rect, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΠΌΠ΅Π΅Ρ‚ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ свойства origin, size значСниями Point(x: 0.0, y: 0.0) ΠΈ Size(width: 0.0, height: 0.0), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ извСстны ΠΈΠ· опрСдСлСния свойств:


let basicRect = Rect()
//исходная Ρ‚ΠΎΡ‡ΠΊΠ° Rect (0.0, 0.0) ΠΈ Π΅Π³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€ (0.0, 0.0)

Π’Ρ‚ΠΎΡ€ΠΎΠΉ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ Rect - init(origin:size: ) Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎ Ρ‚ΠΎ ΠΆΠ΅ самоС Ρ‡Ρ‚ΠΎ ΠΈ ΠΏΠΎΡ‡Π»Π΅Π½Π½Ρ‹ΠΉ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠ³Π»Π° Π±Ρ‹ ΠΈΠΌΠ΅Ρ‚ΡŒ структура, Ссли Π±Ρ‹ Π½Π΅ ΠΈΠΌΠ΅Π»Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠ². Π­Ρ‚ΠΎΡ‚ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ просто присваиваСт значСния Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² origin, size ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ свойствам:


let originRect = Rect(origin: Point(x: 2.0, y: 2.0), size: Size(width: 5.0, height: 5.0))
//исходная Ρ‚ΠΎΡ‡ΠΊΠ° Rect (2.0, 2.0) ΠΈ Π΅Π³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€ (5.0, 5.0)

Π’Ρ€Π΅Ρ‚ΠΈΠΉ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ Rect - init(center:size: ) Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Π±ΠΎΠ»Π΅Π΅ слоТный. Он начинаСтся с вычислСния ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ исходной Ρ‚ΠΎΡ‡ΠΊΠΈ, ΠΎΡΠ½ΠΎΠ²Ρ‹Π²Π°ΡΡΡŒ Π½Π° Ρ‚ΠΎΡ‡ΠΊΠ΅ center ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΈ size. Волько ΠΏΠΎΡ‚ΠΎΠΌ ΠΎΠ½ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ( ΠΈΠ»ΠΈ Π΄Π΅Π»Π΅Π³ΠΈΡ€ΡƒΠ΅Ρ‚) init(origin:size: ) ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ…Ρ€Π°Π½ΠΈΡ‚ Π½ΠΎΠ²ΡƒΡŽ ΠΈΡΡ…ΠΎΠ΄Π½ΡƒΡŽ Ρ‚ΠΎΡ‡ΠΊΡƒ ΠΈ значСния Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠ² ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… свойств:


let centerRect = Rect(center: Point(x: 4.0, y: 4.0), size: Size(width: 3.0, height: 3.0))
//исходная Ρ‚ΠΎΡ‡ΠΊΠ° centerRect’а Ρ€Π°Π²Π½Π° (2.5, 2.5) ΠΈ Π΅Π³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€ (3.0, 3.0)

Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ init(center:size: ) ΠΌΠΎΠ³ Π±Ρ‹ ΠΏΡ€ΠΈΡΠ²ΠΎΠΈΡ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ значСния origin, size ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ свойствам ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ. Однако Π±ΠΎΠ»Π΅Π΅ ΡƒΠ΄ΠΎΠ±Π½ΠΎ (Ρ‚.ΠΊ. Π±ΠΎΠ»Π΅Π΅ понятный ΠΈΠ·-Π·Π° краткости) для ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° init(center:size: ) Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ прСимущСством Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ сущСствуСт Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ с Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎ Ρ‚Π°ΠΊΠΎΠΉ ΠΆΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ.

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

Для Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ способа записи этого ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Π±Π΅Π· ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠ² init(), init(origin:size: ) смотритС Π³Π»Π°Π²Ρƒ Π Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ.

НаслСдованиС ΠΈ инициализация класса

ВсСм свойствам класса, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ ΠΈ Ρ‚Π΅, Ρ‡Ρ‚ΠΎ унаслСдованы Ρƒ супСркласса Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ присвоСны Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹Π΅ значСния, Π²ΠΎ врСмя ΠΈΡ… ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ.

Swift опрСдСляСт Π΄Π²Π° Π²ΠΈΠ΄Π° ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠ² классовых Ρ‚ΠΈΠΏΠΎΠ² для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ всС свойства ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ ΠΊΠ°ΠΊΠΈΠ΅-Π»ΠΈΠ±ΠΎ значСния. Они извСстны ΠΊΠ°ΠΊ Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹Π΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Ρ‹ (конструкторы) ΠΈ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Ρ‹.

НазначСнный ΠΈ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€

НазначСнныС ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Ρ‹ Π² основном ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Ρ‹ класса. Они ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Ρ‹ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ всС свойства прСдставлСнныС классом ΠΈ Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ супСркласса для продолТСния процСсса ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠΈ наслСдований супСрклассов.

Π’Π°ΠΊ слоТилось, Ρ‡Ρ‚ΠΎ классы Ρ‡Π°Ρ‰Π΅ всСго ΠΈΠΌΠ΅ΡŽΡ‚ ΠΎΡ‡Π΅Π½ΡŒ ΠΌΠ°Π»ΠΎ Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹Ρ… ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠ², Ρ‡Π°Ρ‰Π΅ всСго Π±Ρ‹Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ класс ΠΈΠΌΠ΅Π΅Ρ‚ всСго ΠΎΠ΄ΠΈΠ½ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€. НазначСнныС ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Ρ‹ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΡŽΡ‚ Π² сСбС всС Ρ‚ΠΎΡ‡ΠΊΠΈ, Ρ‡Π΅Ρ€Π΅Π· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ процСсс ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈ Ρ‡Π΅Ρ€Π΅Π· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ процСсс ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈΠ΄Π΅Ρ‚ ΠΏΠΎ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ΅ Π² супСркласс.

ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ класс Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠΌΠ΅Ρ‚ΡŒ хотя Π±Ρ‹ ΠΎΠ΄ΠΈΠ½ Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹ΠΉ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€. Π’ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… случаях, это Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠ΅ удовлСтворяСтся наслСдованиСм ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅ Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹Ρ… ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠ² ΠΎΡ‚ супСркласса.

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

Π’Ρ‹ Π½Π΅ обязаны ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°Ρ‚ΡŒ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Ρ‹, Ссли ваш класс Π½Π΅ нуТдаСтся Π² Π½ΠΈΡ…. Π‘ΠΎΠ·Π΄Π°Π²Π°ΠΉΡ‚Π΅ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ всякий Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° это являСтся Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ Ρ€Π°Ρ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΌ ΠΏΡƒΡ‚Π΅ΠΌ ΠΎΠ±Ρ‰Π΅ΠΉ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΡΠΊΠΎΠ½ΠΎΠΌΠΈΡ‚ΡŒ врСмя ΠΈ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ саму ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ класса Π±ΠΎΠ»Π΅Π΅ чистой ΠΈ ΠΊΡ€Π°Ρ‚ΠΊΠΎΠΉ.

Бинтаксис Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹Ρ… ΠΈ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠ²

НазначСнныС ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Ρ‹ для классов Π·Π°ΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ΡΡ Ρ‚ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅ ΠΊΠ°ΠΊ ΠΈ простыС ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Ρ‹ для Ρ‚ΠΈΠΏΠΎΠ² Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ:


init(ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹) {
     выраТСния
}

Π’ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Ρ‹ ΠΏΠΈΡˆΡƒΡ‚ΡΡ Ρ‚ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅, Π½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ слово convenience, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ располагаСтся Π΄ΠΎ слова init ΠΈ раздСляСтся ΠΏΡ€ΠΎΠ±Π΅Π»ΠΎΠΌ:


convenience init(ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹) {
     выраТСния
}

Π”Π΅Π»Π΅Π³ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° для классовых Ρ‚ΠΈΠΏΠΎΠ²

Для простоты ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΉ ΠΌΠ΅ΠΆΠ΄Ρƒ Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹ΠΌΠΈ ΠΈ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°ΠΌΠΈ, Swift ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Ρ‚Ρ€ΠΈ ΠΏΡ€Π°Π²ΠΈΠ»Π° для дСлСгирования Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°ΠΌΠΈ:

ΠŸΡ€Π°Π²ΠΈΠ»ΠΎ 1

НазначСнный ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹ΠΉ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ ΠΈΠ· супСркласса.

ΠŸΡ€Π°Π²ΠΈΠ»ΠΎ 2

Π’ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ ΠΈΠ· Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ класса.

ΠŸΡ€Π°Π²ΠΈΠ»ΠΎ 3

Π’ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ Π² ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΌ счСтС Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹ΠΉ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€.

Π’ΠΎΡ‚ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ просто это Π·Π°ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ:

  • НазначСнныС ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π΄Π΅Π»Π΅Π³ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½Π°Π²Π΅Ρ€Ρ…
  • Π’ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π΄Π΅Π»Π΅Π³ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎ своСму ΡƒΡ€ΠΎΠ²Π½ΡŽ (классу).

Π’ΠΎΡ‚ ΠΊΠ°ΠΊ это ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ выглядит Π² ΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΉ Ρ„ΠΎΡ€ΠΌΠ΅:

Π—Π΄Π΅ΡΡŒ, Π² супСрклассС Π΅ΡΡ‚ΡŒ ΠΎΠ΄ΠΈΠ½ Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹ΠΉ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ ΠΈ Π΄Π²Π° Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°. Один Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Π΄Ρ€ΡƒΠ³ΠΎΠΉ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π² свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ СдинствСнный Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹ΠΉ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€. Π­Ρ‚ΠΎΡ‚ рисунок удовлСтворяСт ΠΏΡ€Π°Π²ΠΈΠ»Π°ΠΌ 2 ΠΈ 3. Π­Ρ‚ΠΎΡ‚ супСркласс сам ΠΏΠΎ сСбС ΡƒΠΆΠ΅ дальшС Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ супСркласса, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ ΠΏΠ΅Ρ€Π²ΠΎΠ΅ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ здСсь Π½Π΅ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌΠΎ.

Подкласс Π½Π° этом рисункС содСрТит Π΄Π²Π° Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹Ρ… ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° ΠΈ ΠΎΠ΄ΠΈΠ½ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€. Π’ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· Π΄Π²ΡƒΡ… Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹Ρ… ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠ², ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ класса. Π­Ρ‚ΠΎ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅ соотвСтствуСт ΠΏΡ€Π°Π²ΠΈΠ»Π°ΠΌ 2 ΠΈ 3. Оба Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹Ρ… ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½ Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹ΠΉ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ ΠΈΠ· супСркласса, для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»Ρƒ 1.

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

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

Π‘Ρ…Π΅ΠΌΠ° Π½ΠΈΠΆΠ΅ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π±ΠΎΠ»Π΅Π΅ ΡΠ»ΠΎΠΆΠ½ΡƒΡŽ ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΡŽ ΠΈΠ· Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅Ρ… классов. Она ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΊΠ°ΠΊ Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹Π΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Ρ‹ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Π² качСствС Ρ‚ΠΎΡ‡Π΅ΠΊ прохоТдСния ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ класса, упрощая Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠ΅ Π²Π·Π°ΠΈΠΌΠΎΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡ срСди Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠΈ классов:

Двухфазная инициализация

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

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

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

Π”Π²ΡƒΡ…Ρ„Π°Π·Π½Ρ‹ΠΉ процСсс ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π² Swift Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π΅Π½ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π² Objective-C. ОсновноС ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρƒ Π½ΠΈΠΌΠΈ ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ Π½Π° ΠΏΠ΅Ρ€Π²ΠΎΠΉ Ρ„Π°Π·Π΅ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π² Objective-C свойства ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‚ значСния 0 ΠΈΠ»ΠΈ nil. Π’ Swift ΠΆΠ΅ этот процСсс Π±ΠΎΠ»Π΅Π΅ Π³ΠΈΠ±ΠΊΠΈΠΉ ΠΈ позволяСт ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹Π΅ значСния ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Ρ‚ΠΈΠΏΡ‹, для ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… значСния 0 ΠΈΠ»ΠΈ nil, ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π½Π΅ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹ΠΌΠΈ.

ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ Swift ΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΈΡ‚ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Π΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ бСзопасности для подтвСрТдСния Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ваша двухфазная инициализация ΠΏΡ€ΠΎΡˆΠ»Π° Π±Π΅Π· ошибок:

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° 1. НазначСнный ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ всС свойства прСдставлСнныС Π΅Π³ΠΎ классом ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ Π΄ΠΎ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΎΠ½ Π΄Π΅Π»Π΅Π³ΠΈΡ€ΡƒΠ΅Ρ‚ Π½Π°Π²Π΅Ρ€Ρ…, Π² ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ супСркласса.

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

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° 2. НазначСнный ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π΄Π΅Π»Π΅Π³ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ супСрклассу ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ Π΄ΠΎ присваивания Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ унаслСдованным свойствам. Если этого сдСлано Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚, Ρ‚ΠΎ Π½ΠΎΠ²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ присвоит Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹ΠΉ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ Π±ΡƒΠ΄Π΅Ρ‚ пСрСписано супСрклассом, ΠΊΠ°ΠΊ Ρ‡Π°ΡΡ‚ΡŒ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ супСркласса.

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

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° 4. Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ экзСмпляра, Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ значСния любого свойства экзСмпляра ΠΈΠ»ΠΈ ΡΡΡ‹Π»Π°Ρ‚ΡŒΡΡ Π½Π° self ΠΊΠ°ΠΊ Π½Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°ΠΊΠΎΠ½Ρ‡Π΅Π½Π° пСрвая Ρ„Π°Π·Π° ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ.

ЭкзСмпляр класса являСтся Π½Π΅ совсСм ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹ΠΌ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Π½Π΅ закончится пСрвая Ρ„Π°Π·Π°. К свойствам ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚ΠΎΠ³Π΄Π°, ΠΊΠ°ΠΊ стало извСстно, Ρ‡Ρ‚ΠΎ экзСмпляр Π²Π°Π»ΠΈΠ΄Π΅Π½ (ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π΅Π½) ΠΊ ΠΊΠΎΠ½Ρ†Ρƒ ΠΏΠ΅Ρ€Π²ΠΎΠΉ Ρ„Π°Π·Ρ‹.

Π’ΠΎΡ‚ ΠΊΠ°ΠΊ ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ двухфазная инициализация, основанная Π½Π° Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅Ρ… ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ°Ρ…(описанныС Π²Ρ‹ΡˆΠ΅):

Π€Π°Π·Π° пСрвая

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

Π€Π°Π·Π° вторая

  • Π”Π²ΠΈΠ³Π°ΡΡΡŒ Π²Π½ΠΈΠ· ΠΏΠΎ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ΅, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹ΠΉ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ Π² этой Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ΅ ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚Π°ΠΊΡƒΡŽ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ, ΠΊΠ°ΠΊ Π½Π°ΡΡ‚Ρ€Π°ΠΈΠ²Π°Ρ‚ΡŒ экзСмпляр. Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‚ доступ ΠΊ self ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ свои свойства, ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ экзСмпляры ΠΈ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΈ Ρ‚.Π΄.
  • И Π½Π°ΠΊΠΎΠ½Π΅Ρ†, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ Π² Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ΅ ΠΈΠΌΠ΅Π΅Ρ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π½Π°ΡΡ‚Ρ€Π°ΠΈΠ²Π°Ρ‚ΡŒ экзСмпляр ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с self.

Π’ΠΎΡ‚ ΠΊΠ°ΠΊ выглядит пСрвая Ρ„Π°Π·Π° для гипотСтичСского подкласса ΠΈ супСркласса:

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

НазначСнный ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ убСТдаСтся, Ρ‡Ρ‚ΠΎ всС свойства, подкласса ΠΈΠΌΠ΅ΡŽΡ‚ значСния, ΠΊΠ°ΠΊ ΡƒΠΊΠ°Π·Π°Π½ΠΎ Π² ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ΅ 1. ПослС этого ΠΎΠ½ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹ΠΉ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ своСго супСркласса для продолТСния ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ.

НазначСнный ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ супСркласса провСряСт Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Ρƒ всСх свойств супСркласса. Π”Π°Π»Π΅Π΅ Π½Π΅Ρ‚ продолТСния Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠΈ Π½Π°Π²Π΅Ρ€Ρ…, ΠΊ Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ супСрклассу, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Π½Π΅Ρ‚ дальнСйшСй Π½ΡƒΠΆΠ΄Ρ‹ Π² Π΄Π΅Π»Π΅Π³ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ.

Π‘Ρ€Π°Π·Ρƒ послС Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ всС свойства супСркласса ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‚ Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹Π΅ значСния, ΠΏΠ°ΠΌΡΡ‚ΡŒ считаСтся ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΉ, Π€Π°Π·Π° 1 Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ.

Π’ΠΎΡ‚ ΠΊΠ°ΠΊ выглядит Π€Π°Π·Π° 2:

НазначСнный ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ супСркласса Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΌΠ΅Π½ΡΡ‚ΡŒ дальнСйшиС экзСмпляры(хотя ΠΈ Π½Π΅ обязан).

Как Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹ΠΉ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ супСркласса Π·Π°ΠΊΠ°Π½Ρ‡ΠΈΠ²Π°Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ, ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π²Π½ΠΎΡΠΈΡ‚ΡŒ измСнСния Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹ΠΉ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ подкласса (хотя ΠΎΠ½ Ρ‚Π°ΠΊ ΠΆΠ΅ ΠΈ Π½Π΅ обязан это Π΄Π΅Π»Π°Ρ‚ΡŒ).

НаконСц, ΠΊΠ°ΠΊ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π·Π°ΠΊΠ°Π½Ρ‡ΠΈΠ²Π°Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹ΠΉ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ подкласса, Ρ‚ΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π²Π½ΠΎΡΠΈΡ‚ΡŒ измСнСния ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΠ·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ Π±Ρ‹Π» Π²Ρ‹Π·Π²Π°Π½.

Π’ΠΎ Π΅ΡΡ‚ΡŒ Ссли Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ вСсь процСсс ΠΎΡ‚Π΄Π°Π»Π΅Π½Π½ΠΎ, Ρ‚ΠΎ ΠΎΠ½ получаСтся, ΠΊΠ°ΠΊ Π±Ρ‹, ΠΈΠ΄Π΅Ρ‚ Π²Π²Π΅Ρ€Ρ…, Π° ΠΏΠΎΡ‚ΠΎΠΌ спускаСтся Π²Π½ΠΈΠ·.

НаслСдованиС ΠΈ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°

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

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

Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Ρ‹ супСркласса Π½Π°ΡΠ»Π΅Π΄ΡƒΡŽΡ‚ΡΡ Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… ΠΎΠ±ΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΡΡ‚Π²Π°Ρ…, Π½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΠΎΠ³Π΄Π° это бСзопасно ΠΈ ΠΊΠΎΠ³Π΄Π° это ΠΈΠΌΠ΅Π΅Ρ‚ смысл Π΄Π΅Π»Π°Ρ‚ΡŒ. Π”Π°Π»Π΅Π΅ ΠΌΡ‹ это Ρ€Π°Π·Π±Π΅Ρ€Π΅ΠΌ.

Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρƒ вашСго подкласса Π±Ρ‹Π»ΠΈ ΠΎΠ΄ΠΈΠ½ ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠ² Π΅Π³ΠΎ супСрклассов, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ свою Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ этих ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠ² Π²Π½ΡƒΡ‚Ρ€ΠΈ подкласса.

Когда Π²Ρ‹ ΠΏΠΈΡˆΠ΅Ρ‚Π΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ подкласса, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ совпадаСт с Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹ΠΌ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠΌ супСркласса, Π²Ρ‹ фактичСски пСрСопрСдСляСтС Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹ΠΉ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ override ΠΏΠ΅Ρ€Π΅Π΄ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° подкласса. Π­Ρ‚ΠΎ Π²Π΅Ρ€Π½ΠΎ Π΄Π°ΠΆΠ΅ Ссли Π²Ρ‹ пСрСопрСдСляСтС автоматичСски прСдоставляСмый ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€, ΠΊΠ°ΠΊ описано Π² Π”Π΅Ρ„ΠΎΠ»Ρ‚Π½Ρ‹Π΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Ρ‹.

Π’Π°ΠΊ ΠΆΠ΅ ΠΊΠ°ΠΊ ΠΈ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ свойства, ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΈΠ»ΠΈ индСксы, присутствиС ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° override подсказываСт Swift ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ супСркласс ΠΈΠΌΠ΅Π΅Ρ‚ ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‰ΠΈΠΉ Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹ΠΉ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ пСрСписан, ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ вашСго ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰Π΅Π³ΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ΠΈ Π±Ρ‹Π»ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΈ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π»ΠΎΡΡŒ.

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

Π’Ρ‹ всСгда ΠΏΠΈΡˆΠ΅Ρ‚Π΅ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ override, ΠΊΠΎΠ³Π΄Π° пСрСписываСтС Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹ΠΉ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ супСркласса, Π΄Π°ΠΆΠ΅ Ссли ваша рСализация ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° подкласса являСтся Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠΌ.

И Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚, Ссли Π²Ρ‹ ΠΏΠΈΡˆΠ΅Ρ‚Π΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ подкласса, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ совпадаСт с Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠΌ супСркласса, Ρ‚ΠΎ этот Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ супСркласса Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ смоТСт Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹Π·Π²Π°Π½ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ вашим подклассом, Π² соотвСтствии с ΠΏΡ€Π°Π²ΠΈΠ»Π°ΠΌΠΈ ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΌΠΈ Π²Ρ‹ΡˆΠ΅. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ваш подкласс Π½Π΅ ΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΈΡ‚ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° супСркласса. И Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅, Π²Ρ‹ Π½Π΅ ΠΏΠΈΡˆΠ΅Ρ‚Π΅ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ override, ΠΊΠΎΠ³Π΄Π° ΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΈΡ‚Π΅ ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‰ΡƒΡŽ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° супСркласса.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π½ΠΈΠΆΠ΅ опрСдСляСт Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ класс Vehicle. Π­Ρ‚ΠΎ Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ класс ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚ свойства numberOfWheels со Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ 0 Ρ‚ΠΈΠΏΠ° Int. Бвойство numberOfWheels ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для вычисляСмого свойства description, для создания описания характСристик транспортного срСдства Ρ‚ΠΈΠΏΠ° String:


class Vehicle {
    var numberOfWheels = 0
    var description: String {
        return "\(numberOfWheels) колСс(о)"
    }
}

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


let vehicle = Vehicle()
print("ВранспортноС срСдство \(vehicle.description)")
//ВранспортноС срСдство 0 колСс(ΠΎ)

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ опрСдСляСт подкласс Bicycle супСркласса Vehicle:


class Bicycle: Vehicle {
    override init() {
        super.init()
        numberOfWheels = 2
    }
}

Подкласс Bicycle опрСдСляСт ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹ΠΉ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ init(). НазначСнный ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ совпадаСт с Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹ΠΌ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠΌ ΠΈΠ· супСркласса VehicleΒ ΠΈ, Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, вСрсия этого ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° класса Bicycle ΠΎΡ‚ΠΌΠ΅Ρ‡Π΅Π½Π° ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠΌ override.

Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ init() для Bicycle начинаСтся с Π²Ρ‹Π·ΠΎΠ²Π° super.init(), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π² свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Π΄Π΅Ρ„ΠΎΠ»Ρ‚Π½Ρ‹ΠΉ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ для супСркласса Vehicle класса Bicycle. Он провСряСт, Ρ‡Ρ‚ΠΎ унаслСдованноС свойство numberOfWheels ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½ΠΎ Π² Vehicle, послС Ρ‡Π΅Π³ΠΎ Ρƒ Bicycle появляСтся Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π΅Π³ΠΎ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ. ПослС Π²Ρ‹Π·ΠΎΠ²Π° super.init() Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ numberOfWheels замСняСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ 2.

Если Π²Ρ‹ создаСтС экзСмпляр Bicycle, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Π΅Π³ΠΎ унаслСдованноС вычисляСмоС свойство description, для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°ΠΊ обновилось свойство numberOfWheels:


let bicycle = Bicycle()
print("ВСлосипСд: \(bicycle.description)")
//ВСлосипСд: 2 колСс(Π°)

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

ΠŸΠΎΠ΄ΠΊΠ»Π°ΡΡΡ‹ ΠΌΠΎΠ³ΡƒΡ‚ ΠΌΠ΅Π½ΡΡ‚ΡŒ унаслСдованныС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ свойства Π² процСссС ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ, Π½ΠΎ нСльзя ΠΌΠ΅Π½ΡΡ‚ΡŒ нСизмСняСмыС унаслСдованныС свойства.

АвтоматичСскоС наслСдованиС инициализатора

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

Допуская, Ρ‡Ρ‚ΠΎ Π²Ρ‹ прСдоставляСтС значСния ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π»ΡŽΠ±ΠΎΠΌΡƒ Π½ΠΎΠ²ΠΎΠΌΡƒ свойству, прСдставлСнному Π² подклассС, Ρ‚ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ Π΄Π²Π° ΠΏΡ€Π°Π²ΠΈΠ»Π°:

ΠŸΡ€Π°Π²ΠΈΠ»ΠΎ 1. Если ваш подкласс Π½Π΅ опрСдСляСт Π½ΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½ΠΎΠ³ΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°, ΠΎΠ½ автоматичСски наслСдуСт всС Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹Π΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Ρ‹ супСркласса.

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

Π­Ρ‚ΠΈ ΠΏΡ€Π°Π²ΠΈΠ»Π° ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌΡ‹ Π΄Π°ΠΆΠ΅ Ссли ваш подкласс ΠΏΠΎΠ·ΠΆΠ΅ добавляСт Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Ρ‹.

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

Подкласс ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹ΠΉ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ супСркласса ΠΊΠ°ΠΊ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ подкласса Π² качСствС части ΡƒΠ΄ΠΎΠ²Π»Π΅Ρ‚Π²ΠΎΡ€ΡΡŽΡ‰Π΅ΠΉ ΠΏΡ€Π°Π²ΠΈΠ»Ρƒ 2.

НазначСнныС ΠΈ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Ρ‹ Π² дСйствии

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹Π΅ ΠΈ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Ρ‹, ΠΈ автоматичСскоС наслСдованиС ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° Π² дСйствии. Π­Ρ‚ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ опрСдСляСт ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΡŽ Ρ‚Ρ€Π΅Ρ… классов Food, RecipeIngredient ΠΈ ShoppingListItem ΠΈ дСмонстрируСт ΠΊΠ°ΠΊ ΠΈΡ… ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Ρ‹ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‚.

Основной (Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ) класс называСтся Food, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΠΌΠ΅Π΅Ρ‚ ΠΎΠ΄Π½ΠΎ простоС свойство Ρ‚ΠΈΠΏΠ° String, Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠ΅ name, ΠΈ обСспСчиваСт Π΄Π²Π° ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° для создания экзСмпляров класса Food:


class Food {
    var name: String
    init(name: String) {
        self.name = name
    }
    convenience init() {
        self.init(name: "[Unnamed]")
    }
}

Π‘Ρ…Π΅ΠΌΠ° Π½ΠΈΠΆΠ΅ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΡƒ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠ² Π² классС Food :

ΠšΠ»Π°ΡΡΡ‹ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π½Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ ΠΏΠΎΡ‡Π»Π΅Π½Π½ΠΎΠ³ΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ класс Food прСдоставляСт Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹ΠΉ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ СдинствСнный Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ name. Π­Ρ‚ΠΎΡ‚ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ использован для создания экзСмпляра Food со спСцифичным ΠΈΠΌΠ΅Π½Π΅ΠΌ:


let namedMeat = Food(name: "Π‘Π΅ΠΊΠΎΠ½")
//имя namedMeat являСтся "Π‘Π΅ΠΊΠΎΠ½"

Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ init(name: String) ΠΈΠ· класса Food, прСдставлСн Π² Π²ΠΈΠ΄Π΅ Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½ΠΎΠ³ΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΎΠ½ провСряСт, Ρ‡Ρ‚ΠΎ всС Ρ…Ρ€Π°Π½ΠΈΠΌΡ‹Π΅ свойства Π½ΠΎΠ²ΠΎΠ³ΠΎ экзСмпляра Food ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹. Класс Food Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ супСркласса, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ init(name: String) Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ Π²Ρ‹Π·ΠΎΠ²Π° super.init() для Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ своСй ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ.

Класс Food Ρ‚Π°ΠΊ ΠΆΠ΅ обСспСчиваСт Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ init() Π±Π΅Π· Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ². Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ init() прСдоставляСт имя плСйсхолдСра для Π½ΠΎΠ²ΠΎΠΉ Π΅Π΄Ρ‹, дСлСгируя ΠΊ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρƒ name ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° init(name: String), давая Π΅ΠΌΡƒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ [Unnamed] :


let mysteryMeat = Food()
//mysteryMeat называСтся "[Unnamed]"

Π’Ρ‚ΠΎΡ€ΠΎΠΉ класс Π² ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΠΈ - это подкласс RecipeIngredient класса Food. Класс RecipeIngredient создаСт модСль ΠΈΠ½Π³Ρ€Π΅Π΄ΠΈΠ΅Π½Ρ‚ΠΎΠ² Π² Ρ€Π΅Ρ†Π΅ΠΏΡ‚Π΅. Он прСдставляСт свойство quantity Ρ‚ΠΈΠΏΠ° Int (Π² Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊ свойству name, унаслСдованноС ΠΎΡ‚ Food) ΠΈ опрСдСляСт Π΄Π²Π° ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° для создания экзСмпляров RecipeIngredient :


class RecipeIngredient: Food {
    var quantity: Int
    init(name: String, quantity: Int) {
        self.quantity = quantity
        super.init(name: name)
    }
    override convenience init(name: String) {
        self.init(name: name, quantity: 1)
    }
}

Π‘Ρ…Π΅ΠΌΠ° Π½ΠΈΠΆΠ΅ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΡƒ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠ² для класса RecipeIngredient:

Класс RecipeIngredient ΠΈΠΌΠ΅Π΅Ρ‚ ΠΎΠ΄ΠΈΠ½ Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹ΠΉ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ init(name: String, quantity: Int), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ использован для установки значСний всСм свойствам нового экзСмпляра RecipeIngredient. Π­Ρ‚ΠΎΡ‚ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ начинаСтся с присваивания ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½ΠΎΠ³ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° quantity свойству quantity, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ являСтся СдинствСнным Π½ΠΎΠ²Ρ‹ΠΌ свойством прСдставлСнным Π² RecipeIngredient. ПослС Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ это сдСлано, ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ Π΄Π΅Π»Π΅Π³ΠΈΡ€ΡƒΠ΅Ρ‚ Π²Π²Π΅Ρ€Ρ… ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ init(name: String) для класса Food. Π­Ρ‚ΠΎΡ‚ процСсс удовлСтворяСт ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ΅ β„–1 ΠΈΠ· Ρ€Π°Π·Π΄Π΅Π»Π° β€œΠ”Π²ΡƒΡ…Ρ„Π°Π·Π½Π°Ρ инициализация”, Ρ‡Ρ‚ΠΎ находится Π²Ρ‹ΡˆΠ΅ Π½Π° этой ΠΆΠ΅ страницС.

RecipeIngredient Ρ‚Π°ΠΊ ΠΆΠ΅ опрСдСляСт Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ init(name: String), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для создания экзСмпляра RecipeIngredient Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ. Π­Ρ‚ΠΎΡ‚ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ присваиваСт Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ количСство Ρ€Π°Π²Π½ΠΎΠ΅ 1 для любого экзСмпляра, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ создано Π±Π΅Π· явного указания количСства. ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ этого Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° ускоряСт созданиС экзСмпляров класса RecipeIngredient ΠΈ позволяСт ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ повторСния ΠΊΠΎΠ΄Π° ΠΏΡ€ΠΈ создании экзСмпляра, Π³Π΄Π΅ свойство quantity ΠΈΠ·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ всСгда Ρ€Π°Π²Π½ΠΎ 1. Π­Ρ‚ΠΎΡ‚ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ Π΄Π΅Π»Π΅Π³ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΏΠΎ Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½ΠΎΠΌΡƒ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Ρƒ класса, пСрСдавая Π΅ΠΌΡƒ quantity Ρ€Π°Π²Π½ΠΎΠ΅ 1.

Π’ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ init(name: String) прСдоставлСнный RecipeIngredient’ом ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Ρ‚Π΅ ΠΆΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹, Ρ‡Ρ‚ΠΎ ΠΈ Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹ΠΉ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ init(name: String) Π² Food. Из-Π·Π° Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ пСрСопрСдСляСт Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹ΠΉ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ ΠΈΠ· своСго супСркласса, Ρ‚ΠΎ ΠΎΠ½ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π΅Π½ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹ΠΌ словом override.

Π”Π°ΠΆΠ΅ Ссли RecipeIngredient прСдставляСт ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ init(name: String) ΠΊΠ°ΠΊ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€, Ρ‚ΠΎ RecipeIngredient Ρ‚Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ ΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΈΡ‚ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ всСх Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹Ρ… ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠ² своСго супСркласса. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ RecipeIngredient автоматичСски наслСдуСт всС свойства Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠ² своСго супСркласса Ρ‚ΠΎΠΆΠ΅.

Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ супСркласс для класса RecipeIngredient являСтся Food, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΠΌΠ΅Π΅Ρ‚ СдинствСнный ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ init(). ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ этот ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ наслСдуСтся RecipeIngredient. НаслСдованная вСрсия init() Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½ΠΈΡ€ΡƒΠ΅Ρ‚ Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅ ΠΊΠ°ΠΊ ΠΈ вСрсия Π² Food, Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΠΎΠ½Π° Π΄Π΅Π»Π΅Π³ΠΈΡ€ΡƒΠ΅Ρ‚ Π² RecipeIngredient Π²Π΅Ρ€ΡΠΈΡŽ init(name: String), Π° Π½Π΅ Π² Π²Π΅Ρ€ΡΠΈΡŽ Food.

ВсС Ρ‚Ρ€ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Ρ‹ для создания Π½ΠΎΠ²Ρ‹Ρ… RecipeIngredient экзСмпляров:


let oneMysteryItem = RecipeIngredient()
let oneBacon = RecipeIngredient(name: "Bacon")
let sixEggs = RecipeIngredient(name: "Eggs", quantity: 6)

Π’Ρ€Π΅Ρ‚ΠΈΠΉ ΠΈ послСдний класс Π² ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΠΈ - подкласс ShoppingListItem класса RecipeIngredient. ShoppingListItem ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Ρ€Π΅Ρ†Π΅ΠΏΡ‚Ρ‹ ΠΈΠ· ΠΈΠ½Π³Ρ€Π΅Π΄ΠΈΠ΅Π½Ρ‚ΠΎΠ², ΠΊΠ°ΠΊ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ½ΠΈ ΠΏΠΎΡΠ²Π»ΡΡŽΡ‚ΡΡ Π² листС ΠΏΠΎΠΊΡƒΠΏΠΎΠΊ.

ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ элСмСнт Π² листС ΠΏΠΎΠΊΡƒΠΏΠΎΠΊ (shopping list) начинаСтся с β€œΠ½Π΅ куплСн” ΠΈΠ»ΠΈ β€œunpurchased”. Β ShoppingListItemΒ ΠΈΠΌΠ΅Π΅Ρ‚ Π±ΡƒΠ»Π΅Π²ΠΎ свойство purchased, со Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ false. ShoppingListItem Ρ‚Π°ΠΊ ΠΆΠ΅ добавляСт высчитываСмоС свойство description, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ прСдоставляСт тСкстовоС описаниС экзСмпляра ShoppingListItem :


class ShoppingListItem: RecipeIngredient {
    var purchased = false
    var description: String {
        var output = "\(quantity) x \(name)"
        output += purchased ? " βœ”" : " ✘"
        return output
    }
}

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

ShoppingListItem Π½Π΅ опрСдСляСт ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ для прСдоставлСния исходного значСния для purchased, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ элСмСнты Π² листС ΠΏΠΎΠΊΡƒΠΏΠΎΠΊ, ΠΊΠ°ΠΊ смодСлировано Ρ‚ΡƒΡ‚, сначала ΠΈΠΌΠ΅ΡŽΡ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ false, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΎΠ½ΠΈ Π½Π΅ ΠΊΡƒΠΏΠ»Π΅Π½Ρ‹.

Π’Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ прСдоставляСт исходныС значСния для всСх свойств, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ½ прСдставляСт ΠΈ Π½Π΅ опрСдСляСт Π½ΠΈΠΊΠ°ΠΊΠΈΡ… своих ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠ², Ρ‚ΠΎ ShoppingListItem автоматичСски наслСдуСт всС Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹Π΅ ΠΈ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Ρ‹ ΠΈΠ· своСго супСркласса.

Π‘Ρ…Π΅ΠΌΠ° Π½ΠΈΠΆΠ΅ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚ ΠΎΠ±Ρ‰ΡƒΡŽ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΡƒ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΉ для всСх Ρ‚Ρ€Π΅Ρ… классов:

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ всС Ρ‚Ρ€ΠΈ унаслСдованных ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° для создания Π½ΠΎΠ²ΠΎΠ³ΠΎ экзСмпляра ShoppingListItem :


var breakfastList = [
    ShoppingListItem(),
    ShoppingListItem(name: "Bacon"),
    ShoppingListItem(name: "Eggs", quantity: 6)
]
breakfastList[0].name = "Orange juice"
breakfastList[0].purchased = true
for item in breakfastList {
    print(item.description)
}
// 1 x Orange juice βœ”
// 1 x Bacon ✘
// 6 x Eggs ✘

Π—Π΄Π΅ΡΡŒ ΠΌΡ‹ создаСм Π½ΠΎΠ²Ρ‹ΠΉ массив breakfastList, заполняя Π΅Π³ΠΎ трСмя экзСмплярами класса ShoppingListItem. Π’ΠΈΠΏ массива выводится ΠΈΠ· [ShoppingListItem]. ПослС Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ массив создан, ΠΌΡ‹ мСняСм исходноС имя с "[Unnamed]" Π½Π° "Orange juice" ΠΈ присваиваСм свойству purchased Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ true. ΠŸΠΎΡ‚ΠΎΠΌ ΠΌΡ‹ Π²Ρ‹Π²ΠΎΠ΄ΠΈΠΌ Π½Π° экран описаниС ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ элСмСнта массива, Π³Π΄Π΅ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ всС Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹Π΅ значСния установлСны Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΌΡ‹ ΠΈ ΠΎΠΆΠΈΠ΄Π°Π»ΠΈ.

ΠŸΡ€ΠΎΠ²Π°Π»ΠΈΠ²Π°ΡŽΡ‰ΠΈΠ΅ΡΡ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Ρ‹

Иногда Π±Ρ‹Π²Π°Π΅Ρ‚ Π½ΡƒΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ класс, структуру ΠΈΠ»ΠΈ пСрСчислСниС, инициализация ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π΅ ΡΡ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ, ΠΏΡ€ΠΎΠ²Π°Π»ΠΈΡ‚ΡŒΡΡ. Π’Π°ΠΊΠΎΠ΅ нСисполнСниС ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹Π·Π²Π°Π½ΠΎ Π½Π΅ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹ΠΌΠΈ значСниями ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΈΠ»ΠΈ отсутствиСм Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΠΎΠ³ΠΎ внСшнСго источника Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ»ΠΈ Π΅Ρ‰Π΅ ΠΊΠ°ΠΊΠΎΠ΅-Π½ΠΈΠ±ΡƒΠ΄ΡŒ ΠΎΠ±ΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΡΡ‚Π²ΠΎ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ΡŒ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ.

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

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

Π’Ρ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ²Π°Π»ΠΈΠ²Π°ΡŽΡ‰ΠΈΠΉΡΡ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ ΠΈ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Π΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Ρ‹ с ΠΎΠ΄Π½ΠΈΠΌΠΈ ΠΈ Ρ‚Π΅ΠΌΠΈ ΠΆΠ΅ ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ ΠΈ Ρ‚ΠΈΠΏΠ°ΠΌΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ².

ΠŸΡ€ΠΎΠ²Π°Π»ΠΈΠ²Π°ΡŽΡ‰ΠΈΠΉΡΡ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ создаСт ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΠ½ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚. Π’Ρ‹ ΠΏΠΈΡˆΠ΅Ρ‚Π΅ return nil Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΏΡ€ΠΎΠ²Π°Π»ΠΈΠ²Π°ΡŽΡ‰Π΅Π³ΠΎΡΡ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° для ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ†ΠΈΠΈ Ρ‚ΠΎΡ‡ΠΊΠΈ, Π³Π΄Π΅ инициализация ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΠ²Π°Π»ΠΈΡ‚ΡŒΡΡ.

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

Π‘Ρ‚Ρ€ΠΎΠ³ΠΎ говоря, ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Ρ‹ Π½Π΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ. Π˜Ρ… Ρ€ΠΎΠ»ΡŒ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡŽΡ‚, Ρ‡Ρ‚ΠΎ self ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΈ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½, Π΄ΠΎ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ инициализация закончится. НСсмотря Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ ΠΏΠΈΡˆΠ΅Ρ‚Π΅ return nil для указания Π½Π΅ΡƒΠ΄Π°Ρ‡ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ, Π²Ρ‹ Π½Π΅ ΠΏΠΈΡˆΠ΅Ρ‚Π΅ слово return Π² случаС, Ссли инициализация ΠΏΡ€ΠΎΡˆΠ»Π° ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ.

НапримСр, ΠΏΡ€ΠΎΠ²Π°Π»ΠΈΠ²Π°ΡŽΡ‰ΠΈΠ΅ΡΡ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Ρ‹ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‚ΡΡ для прСобразования числового Ρ‚ΠΈΠΏΠ°. Для Π³Π°Ρ€Π°Π½Ρ‚ΠΈΠΈ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρƒ числовыми Ρ‚ΠΈΠΏΠ°ΠΌΠΈ ΠΈΠΌΠ΅Π΅Ρ‚ смысл, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Β  init(exactly: ). Если ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Ρ‚ΠΎ Π΄Π°Π½Π½Ρ‹ΠΉ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ "провалится", Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Π²Π΅Ρ€Π½Π΅Ρ‚Β nil.


let wholeNumber: Double = 12345.0
let pi = 3.14159
 
if let valueMaintained = Int(exactly: wholeNumber) {
    print("\(wholeNumber) ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Π² Int ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ \(valueMaintained)")
}
// Π’Ρ‹Π²Π΅Π΄Π΅Ρ‚ "12345.0 ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Π² Int ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 12345"
 
let valueChanged = Int(exactly: pi)
// valueChanged is of type Int?, not Int
 
if valueChanged == nil {
    print("\(pi) ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Π² Int Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ")
}
// Π’Ρ‹Π²Π΅Π΄Π΅Ρ‚ "3.14159 ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Π² Int Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ"

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π½ΠΈΠΆΠ΅ опрСдСляСт структуру Animal, с константным свойством Ρ‚ΠΈΠΏΠ° String с ΠΈΠΌΠ΅Π½Π΅ΠΌ species. Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° Animal Ρ‚Π°ΠΊ ΠΆΠ΅ опрСдСляСт ΠΏΡ€ΠΎΠ²Π°Π»ΠΈΠ²Π°ΡŽΡ‰ΠΈΠΉΡΡ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ с ΠΎΠ΄Π½ΠΈΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ species. Π­Ρ‚ΠΎΡ‚ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ провСряСт равняСтся Π»ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠ·Β  species Π² ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ пустой строкС. Если строка Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ пустая, Ρ‚ΠΎ возвращаСтся nil, ΠΈ срабатываСт ΠΏΡ€ΠΎΠ²Π°Π»ΠΈΠ²Π°ΡŽΡ‰ΠΈΠΉΡΡ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ свойства species установлСно ΠΈ инициализация ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ.


struct Animal {
    let species: String
    init?(species: String) {
        if species.isEmpty { return nil }
        self.species = species
    }
}

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ этот ΠΏΡ€ΠΎΠ²Π°Π»ΠΈΠ²Π°ΡŽΡ‰ΠΈΠΉ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ для ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ экзСмпляр структуры Animal ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ Π»ΠΈ ΠΏΡ€ΠΎΡˆΠ»Π° инициализация:


let someCreature = Animal(species: "Π–ΠΈΡ€Π°Ρ„")
// someCreature ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ Animal?, Π½ΠΎ Π½Π΅ Animal
 
if let giraffe = someCreature {
 print("ΠœΡ‹ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π»ΠΈ ΠΆΠΈΠ²ΠΎΡ‚Π½ΠΎΠ΅ Ρ‚ΠΈΠΏΠ° \(giraffe.species) ")
}
// Π’Ρ‹Π²Π΅Π΄Π΅Ρ‚ "ΠœΡ‹ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π»ΠΈ ΠΆΠΈΠ²ΠΎΡ‚Π½ΠΎΠ΅ Ρ‚ΠΈΠΏΠ° Π–ΠΈΡ€Π°Ρ„ "

Если Π²Ρ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚Π΅ ΠΏΡƒΡΡ‚ΡƒΡŽ строку Π² ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ species ΠΏΡ€ΠΎΠ²Π°Π»ΠΈΠ²Π°ΡŽΡ‰Π΅Π³ΠΎΡΡ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°, Ρ‚ΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ сбой ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ:


let anonymousCreature = Animal(species: "")
// anonymousCreature ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ Animal?, Π½ΠΎ Π½Π΅ Animal
 
if anonymousCreature == nil {
    print("НСизвСстноС ΠΆΠΈΠ²ΠΎΡ‚Π½ΠΎΠ΅ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½ΠΎ")
}
 
// Π’Ρ‹Π²Π΅Π΄Π΅Ρ‚ "НСизвСстноС ΠΆΠΈΠ²ΠΎΡ‚Π½ΠΎΠ΅ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½ΠΎ"

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

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΡ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ пустой строки (ΠΊ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ "", Π° Π½Π΅ "Π–ΠΈΡ€Π°Ρ„") это Π½Π΅ Ρ‚ΠΎΠΆΠ΅ самоС, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ Π½Π° nil, для ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ†ΠΈΠΈ отсутствия значСния ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ String. Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π²Ρ‹ΡˆΠ΅, пустая строка ("") ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Π° ΠΈ являСтся ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΉ String, Π° Π½Π΅ String?. Однако это Π½Π΅ допустимо Π² нашСм случаС, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΆΠΈΠ²ΠΎΡ‚Π½ΠΎΠ΅ ΠΈΠΌΠ΅Π»ΠΎ пустоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, свойства species. Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΌΠΎΠ΄Π΅Π»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΎΠ΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅, ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΠΏΡ€ΠΎΠ²Π°Π»ΠΈΠ²Π°ΡŽΡ‰ΠΈΠΉΡΡ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹Π΄Π°Π΅Ρ‚ сбой, Ссли Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΏΡƒΡΡ‚ΡƒΡŽ строку.

ΠŸΡ€ΠΎΠ²Π°Π»ΠΈΠ²Π°ΡŽΡ‰ΠΈΠ΅ΡΡ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Ρ‹ для пСрСчислСний

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ²Π°Π»ΠΈΠ²Π°ΡŽΡ‰ΠΈΠΉΡΡ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ для Π²Ρ‹Π±ΠΎΡ€Π° подходящСго Ρ‡Π»Π΅Π½Π° пСрСчислСния ΠΎΡΠ½ΠΎΠ²Ρ‹Π²Π°ΡΡΡŒ Π½Π° ΠΎΠ΄Π½ΠΎΠΌ ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ². Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΠ²Π°Π»ΠΈΡ‚ΡŒΡΡ, Ссли прСдоставлСнныС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ подходящСму Ρ‡Π»Π΅Π½Ρƒ пСрСчислСния.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π½ΠΈΠΆΠ΅ опрСдСляСт пСрСчислСниС TemperatureUnit с трСмя Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΌΠΈ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π°ΠΌΠΈ (kelvin, celsius ΠΈ fahrenheit). ΠŸΡ€ΠΎΠ²Π°Π»ΠΈΠ²Π°ΡŽΡ‰ΠΈΠΉΡΡ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π°ΠΉΡ‚ΠΈ подходящий Ρ‡Π»Π΅Π½ пСрСчислСния для значСния Ρ‚ΠΈΠΏΠ° Character, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ прСдставляСт символ Ρ‚Π΅ΠΌΠΏΠ΅Ρ€Π°Ρ‚ΡƒΡ€Ρ‹:


enum TemperatureUnit {
    case kelvin, celsius, fahrenheit
    init?(symbol: Character) {
        switch symbol {
        case "K":
            self = .kelvin
        case "C":
            self = .celsius
        case "F":
            self = .fahrenheit
        default:
            return nil
        }
    }
}

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ этот ΠΏΡ€ΠΎΠ²Π°Π»ΠΈΠ²Π°ΡŽΡ‰ΠΈΠΉΡΡ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ для Π²Ρ‹Π±ΠΎΡ€Π° ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ Ρ‡Π»Π΅Π½Π° ΠΈΠ· Ρ‚Ρ€Π΅Ρ… Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… состояний ΠΈ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ²Π°Π» ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ, Ссли ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Π½Π΅ соотвСтствуСт этим состояниям:


let fahrenheitUnit = TemperatureUnit(symbol: "F")
if fahrenheitUnit != nil {
  print("Π­Ρ‚Π° Π΅Π΄ΠΈΠ½ΠΈΡ†Π° измСрСния Ρ‚Π΅ΠΌΠΏΠ΅Ρ€Π°Ρ‚ΡƒΡ€Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π°, Π° Π·Π½Π°Ρ‡ΠΈΡ‚ наша инициализация ΠΏΡ€ΠΎΡˆΠ»Π° ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ!")
}
 
// Π’Ρ‹Π²Π΅Π΄Π΅Ρ‚ "Π­Ρ‚Π° Π΅Π΄ΠΈΠ½ΠΈΡ†Π° измСрСния Ρ‚Π΅ΠΌΠΏΠ΅Ρ€Π°Ρ‚ΡƒΡ€Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π°, Π° Π·Π½Π°Ρ‡ΠΈΡ‚ наша инициализация ΠΏΡ€ΠΎΡˆΠ»Π° ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ!"
 
let unknownUnit = TemperatureUnit(symbol: "X")
if  unknownUnit == nil {
  print("Π•Π΄ΠΈΠ½ΠΈΡ†Π° измСрСния Ρ‚Π΅ΠΌΠΏΠ΅Ρ€Π°Ρ‚ΡƒΡ€Ρ‹ Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π°, Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΌΡ‹ Π·Π°Ρ„Π΅ΠΉΠ»ΠΈΠ»ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ")
}
 
// Π’Ρ‹Π²Π΅Π΄Π΅Ρ‚ "Π•Π΄ΠΈΠ½ΠΈΡ†Π° измСрСния Ρ‚Π΅ΠΌΠΏΠ΅Ρ€Π°Ρ‚ΡƒΡ€Ρ‹ Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π°, Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΌΡ‹ Π·Π°Ρ„Π΅ΠΉΠ»ΠΈΠ»ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ"

ΠŸΡ€ΠΎΠ²Π°Π»ΠΈΠ²Π°ΡŽΡ‰ΠΈΠ΅ΡΡ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Ρ‹ для пСрСчислСний с Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹ΠΌΠΈ значСниями

ΠŸΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»Π΅Π½ΠΈΡ с Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹ΠΌΠΈ значСниями ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‚ ΠΏΡ€ΠΎΠ²Π°Π»ΠΈΠ²Π°ΡŽΡ‰ΠΈΠΉΡΡ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ init?(rawValue: ), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ rawValue подходящСго Ρ‚ΠΈΠΏΠ° ΠΈ Π²Ρ‹Π±ΠΈΡ€Π°Π΅Ρ‚ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ Ρ‡Π»Π΅Π½ пСрСчислСния, Ссли ΠΎΠ½ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ подходящий, ΠΈΠ»ΠΈ срабатываСт сбой ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ, Ссли ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π½Π΅ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ совпадСния срСди Ρ‡Π»Π΅Π½ΠΎΠ² пСрСчислСния.

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠ΅Ρ€Π΅ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ TemperatureUnit ΠΈΠ· ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Π²Ρ‹ΡˆΠ΅ для использования Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Ρ‚ΠΈΠΏΠ° Character ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ init?(rawValue: ):


enum TemperatureUnit: Character {
  case kelvin = "K", celsius = "C", fahrenheit = "F"
}
 
let fahrenheitUnit = TemperatureUnit(rawValue: "F")
if fahrenheitUnit != nil {
  print("Π­Ρ‚Π° Π΅Π΄ΠΈΠ½ΠΈΡ†Π° измСрСния Ρ‚Π΅ΠΌΠΏΠ΅Ρ€Π°Ρ‚ΡƒΡ€Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π°, Π° Π·Π½Π°Ρ‡ΠΈΡ‚ наша инициализация ΠΏΡ€ΠΎΡˆΠ»Π° ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ!")
}
 
// Π’Ρ‹Π²Π΅Π΄Π΅Ρ‚ "Π­Ρ‚Π° Π΅Π΄ΠΈΠ½ΠΈΡ†Π° измСрСния Ρ‚Π΅ΠΌΠΏΠ΅Ρ€Π°Ρ‚ΡƒΡ€Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π°, Π° Π·Π½Π°Ρ‡ΠΈΡ‚ наша инициализация ΠΏΡ€ΠΎΡˆΠ»Π° ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ!"
 
let unknownUnit = TemperatureUnit(rawValue: "X")
if  unknownUnit == nil {
  print("Π•Π΄ΠΈΠ½ΠΈΡ†Π° измСрСния Ρ‚Π΅ΠΌΠΏΠ΅Ρ€Π°Ρ‚ΡƒΡ€Ρ‹ Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π°, Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΌΡ‹ Π·Π°Ρ„Π΅ΠΉΠ»ΠΈΠ»ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ.")
}
 
// Π’Ρ‹Π²Π΅Π΄Π΅Ρ‚ "Π•Π΄ΠΈΠ½ΠΈΡ†Π° измСрСния Ρ‚Π΅ΠΌΠΏΠ΅Ρ€Π°Ρ‚ΡƒΡ€Ρ‹ Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π°, Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΌΡ‹ Π·Π°Ρ„Π΅ΠΉΠ»ΠΈΠ»ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ."

РаспространСниС ΠΏΡ€ΠΎΠ²Π°Π»ΠΈΠ²Π°ΡŽΡ‰Π΅Π³ΠΎΡΡ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°

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

Π’ любом случаС, Ссли Π²Ρ‹ Π΄Π΅Π»Π΅Π³ΠΈΡ€ΡƒΠ΅Ρ‚Π΅ Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Ρƒ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€ΠΎΠ²Π°Π»ΠΈΠ²Π°Π΅Ρ‚ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽΒ Ρ‚ΠΎ ΠΈ вСсь процСсс ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ проваливаСтся Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ Π·Π° Π½ΠΈΠΌ, ΠΈ Π΄Π°Π»Π΅Π΅ Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ ΠΊΠΎΠ΄ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΡƒΠΆΠ΅ Π½Π΅ исполняСтся.

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

ΠŸΡ€ΠΎΠ²Π°Π»ΠΈΠ²Π°ΡŽΡ‰ΠΈΠΉΡΡ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ‚Π°ΠΊΠΆΠ΅ Π΄Π΅Π»Π΅Π³ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊ Π½Π΅ΠΏΡ€ΠΎΠ²Π°Π»ΠΈΠ²Π°ΡŽΡ‰Π΅ΠΌΡƒΡΡ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Ρƒ. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ‚Π°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄, Π²Π°ΠΌ слСдуСт Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ΅ состояниС ΠΏΡ€ΠΎΠ²Π°Π»Π° Π² ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ процСсс ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС Π½Π΅ провалится.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π½ΠΈΠΆΠ΅ опрСдСляСт подкласс CartItem класса Product. CartItem создаСт модСль элСмСнта Π² ΠΊΠΎΡ€Π·ΠΈΠ½Π΅ ΠΎΠ½Π»Π°ΠΉΠ½ Π·Π°ΠΊΠ°Π·Π°. CartItem прСдставляСт свойство хранСния quantity ΠΈ провСряСт, Ρ‡Ρ‚ΠΎΠ±Ρ‹ это свойство всСгда ΠΈΠΌΠ΅Π»ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ 1:


class Product {
    let name: String
    init?(name: String) {
        if name.isEmpty { return nil }
        self.name = name
    }
}
 
class CartItem: Product {
    let quantity: Int
    init?(name: String, quantity: Int) {
        if quantity < 1 { return nil }
        self.quantity = quantity
        super.init(name: name)
    }
}

ΠŸΡ€ΠΎΠ²Π°Π»ΠΈΠ²Π°ΡŽΡ‰ΠΈΠΉΡΡ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ для CartItem начинаСтся с Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ quantity 1 ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅. Если Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ quantity Π½Π΅ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΠ΅, Ρ‚ΠΎ вся инициализация проваливаСтся ΠΈ ΠΊΠΎΠ΄ дальшС Π½Π΅ исполняСтся. Π’Π°ΠΊ ΠΆΠ΅ ΠΏΡ€ΠΎΠ²Π°Π»ΠΈΠ²Π°ΡŽΡ‰ΠΈΠΉΡΡ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ Product провСряСт Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ свойства name, ΠΈ Ссли ΠΎΠ½ΠΎ Ρ€Π°Π²Π½ΠΎ пустой строкС, Ρ‚ΠΎ инициализация Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ прСкращаСтся.

Если Π²Ρ‹ создаСтС экзСмпляр CartItem с name Π½Π΅ Ρ€Π°Π²Π½ΠΎΠΉ пустой строкС ΠΈ quantity Ρ€Π°Π²Π½ΠΎΠΌΡƒ 1 ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅, Ρ‚ΠΎ инициализация ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ:


if let twoSocks = CartItem(name: "sock", quantity: 2) {
    print("Item: \(twoSocks.name), quantity: \(twoSocks.quantity)")
}
// Π’Ρ‹Π²Π΅Π΄Π΅Ρ‚ "Item: sock, quantity: 2"

Если Π²Ρ‹ ΠΏΠΎΠΏΡ‹Ρ‚Π°Π΅Ρ‚Π΅ΡΡŒ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ экзСмпляр CartItem с quantity со Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ 0, Ρ‚ΠΎ инициализация провалится:


if let zeroShirts = CartItem(name: "shirt", quantity: 0) {
    print("Item: \(zeroShirts.name), quantity: \(zeroShirts.quantity)")
} else {
    print("НСвозмоТно ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ноль Ρ„ΡƒΡ‚Π±ΠΎΠ»ΠΎΠΊ")
}
// Π’Ρ‹Π²Π΅Π΄Π΅Ρ‚ "НСвозмоТно ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ноль Ρ„ΡƒΡ‚Π±ΠΎΠ»ΠΎΠΊ"

Аналогично, Ссли Π²Ρ‹ ΠΏΠΎΠΏΡ‹Ρ‚Π°Π΅Ρ‚Π΅ΡΡŒ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ экзСмпляр CartItem с name Ρ€Π°Π²Π½Ρ‹ΠΌ пустой строкС, Ρ‚ΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ супСркласса Product Π²Ρ‹Π·ΠΎΠ²Π΅Ρ‚ Π½Π΅ΡƒΠ΄Π°Ρ‡Ρƒ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ:


if let oneUnnamed = CartItem(name: "", quantity: 1) {
    print("Item: \(oneUnnamed.name), quantity: \(oneUnnamed.quantity)")
} else {
    print("НСвозмоТно ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΠ²Π°Ρ€ Π±Π΅Π· ΠΈΠΌΠ΅Π½ΠΈ")
}
// Π’Ρ‹Π²Π΅Π΄Π΅Ρ‚ "НСвозмоТно ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΠ²Π°Ρ€ Π±Π΅Π· ΠΈΠΌΠ΅Π½ΠΈ"

ΠŸΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ²Π°Π»ΠΈΠ²Π°ΡŽΡ‰Π΅Π³ΠΎΡΡ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ²Π°Π»ΠΈΠ²Π°ΡŽΡ‰ΠΈΠΉΡΡ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ супСркласса Π² подклассС, Ρ‚Π°ΠΊ ΠΆΠ΅ ΠΊΠ°ΠΊ любой Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€. Или Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ²Π°Π»ΠΈΠ²Π°ΡŽΡ‰ΠΈΠΉ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ супСркласса Π½Π΅ΠΏΡ€ΠΎΠ²Π°Π»ΠΈΠ²Π°ΡŽΡ‰ΠΈΠΌΡΡ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠΌ подкласса. Π­Ρ‚ΠΎ позволяСт Π²Π°ΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ подкласс, для ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ инициализация Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΠ²Π°Π»ΠΈΡ‚ΡŒΡΡ, Π΄Π°ΠΆΠ΅ ΠΊΠΎΠ³Π΄Π° инициализация супСркласса позволяСт это ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ.

Π—Π°ΠΏΠΎΠΌΠ½ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ Ссли Π²Ρ‹ пСрСопрСдСляСтС ΠΏΡ€ΠΎΠ²Π°Π»ΠΈΠ²Π°ΡŽΡ‰ΠΈΠΉΡΡ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ супСркласса Π½Π΅ ΠΏΡ€ΠΎΠ²Π°Π»ΠΈΠ²Π°ΡŽΡ‰ΠΈΠΌΡΡ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠΌ подкласса, Ρ‚ΠΎ СдинствСнным способом Π΄Π΅Π»Π΅Π³ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π² ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ супСркласса - ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ ΠΈΠ·Π²Π»Π΅Ρ‡Π΅Π½ΠΈΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° ΠΈΠ· ΠΏΡ€ΠΎΠ²Π°Π»ΠΈΠ²Π°ΡŽΡ‰Π΅Π³ΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° супСркласса.

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

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ²Π°Π»ΠΈΠ²Π°ΡŽΡ‰ΠΈΠΉΡΡ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ Π½Π΅ΠΏΡ€ΠΎΠ²Π°Π»ΠΈΠ²Π°ΡŽΡ‰ΠΈΠΌΡΡ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠΌ, Π½ΠΎ Π½Π΅ Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π½ΠΈΠΆΠ΅ опрСдСляСт класс Document. Π­Ρ‚ΠΎΡ‚ класс ΠΌΠΎΠ΄Π΅Π»ΠΈΡ€ΡƒΠ΅Ρ‚ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½ свойством name, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΎΡ‚Π»ΠΈΡ‡Π½ΠΎΠ΅ ΠΎΡ‚ пустого ΠΈΠ»ΠΈ nil, Π½ΠΎ Π½ΠΈΠΊΠ°ΠΊ Π½Π΅ ΠΏΡƒΡΡ‚ΡƒΡŽ строку:


class Document {
    var name: String?
    //этот ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ создаСт Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ со Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ nil свойства name
    init(){}
    //этот ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ создаСт Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ с Π½Π΅ пустым свойством name
    init?(name: String) {
      if name.isEmpty { return nil }
      self.name = name
    }
}

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ опрСдСляСт подкласс AutomaticallyNamedDocument класса Document. AutomaticallyNamedDocument являСтся подклассом, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ пСрСопрСдСляСт ΠΎΠ±Π° Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹Ρ… ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°, прСдставлСнных Π² Document. Π­Ρ‚ΠΎ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ экзСмпляр AutomaticallyNamedDocument Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ исходноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ "[Untitled]" свойства name, Ссли экзСмпляр создан Π±Π΅Π· ΠΈΠΌΠ΅Π½ΠΈ ΠΈΠ»ΠΈ Ссли пустая строка ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π° Π² ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ init(name: ):


class AutomaticallyNamedDocument: Document {
    override init() {
        super.init()
        self.name = "[Untitled]"
    }
    override init(name: String) {
        super.init()
        if name.isEmpty {
            self.name = "[Untitled]"
        } else {
            self.name = name
        }
    }
}

AutomaticallyNamedDocument пСрСопрСдСляСт ΠΏΡ€ΠΎΠ²Π°Π»ΠΈΠ²Π°ΡŽΡ‰ΠΈΠΉΡΡ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ init?(name: ) супСркласса Π½Π΅ΠΏΡ€ΠΎΠ²Π°Π»ΠΈΠ²Π°ΡŽΡ‰ΠΈΠΌΡΡ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠΌ init(name: ). Из-Π·Π° Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ AutomaticallyNamedDocument справляСтся с пустой строкой ΠΈΠ½Π°Ρ‡Π΅, Ρ‡Π΅ΠΌ Π΅Π³ΠΎ супСркласс, Π΅Π³ΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΡ€ΠΎΠ²Π°Π»ΠΈΡ‚ΡŒΡΡ, Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΎΠ½ прСдоставляСт Π½Π΅ΠΏΡ€ΠΎΠ²Π°Π»ΠΈΠ²Π°ΡŽΡ‰ΡƒΡŽΡΡ Π²Π΅Ρ€ΡΠΈΡŽ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° вмСсто ΠΏΡ€ΠΎΠ²Π°Π»ΠΈΠ²Π°ΡŽΡ‰Π΅ΠΉΡΡ.

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ ΠΈΠ·Π²Π»Π΅Ρ‡Π΅Π½ΠΈΠ΅ Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° для Π²Ρ‹Π·ΠΎΠ²Π° ΠΏΡ€ΠΎΠ²Π°Π»ΠΈΠ²Π°ΡŽΡ‰Π΅Π³ΠΎΡΡ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° ΠΈΠ· супСркласса, Π² качСствС части Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π½Π΅ΠΏΡ€ΠΎΠ²Π°Π»ΠΈΠ²Π°ΡŽΡ‰Π΅Π³ΠΎΡΡ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° подкласса. НапримСр, подкласс класса UntitledDocument всСгда ΠΈΠΌΠ΅Π΅Ρ‚ имя "[Untitled]", ΠΈ ΠΎΠ½ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΏΡ€ΠΎΠ²Π°Π»ΠΈΠ²Π°ΡŽΡ‰ΠΈΠΉΡΡ init(name: ) ΠΈΠ· супСркласса Π²ΠΎ врСмя ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ.


class UntitledDocument: Document {
    override init() {
        super.init(name: "[Untitled]")!
    }
}

Π’ этом случаС ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ супСркласса init(name: ) ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΎΡˆΠΈΠ±ΠΊΡƒ исполнСния, Ссли Π² Π½Π΅Π³ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π° пустая строка. Однако, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ этот ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΈΠΌΠ΅Π΅Ρ‚ ΡΡ‚Ρ€ΠΎΠΊΠΎΠ²ΡƒΡŽ константу, Ρ‚ΠΎ этот ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ большС Π½Π΅ провалится, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ошибки исполнСния большС Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚.

ΠŸΡ€ΠΎΠ²Π°Π»ΠΈΠ²Π°ΡŽΡ‰ΠΈΠΉΡΡ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ init!

ΠžΠ±Ρ‹Ρ‡Π½ΠΎ Π²Ρ‹ опрСдСляСтС ΠΏΡ€ΠΎΠ²Π°Π»ΠΈΠ²Π°ΡŽΡ‰ΠΈΠΉΡΡ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ создаСт ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ экзСмпляр ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ Ρ‚ΠΈΠΏΠ° ΠΏΡƒΡ‚Π΅ΠΌ размСщСния Π·Π½Π°ΠΊΠ° вопроса послС ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ слова init (init?). ΠΠ»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½ΠΎ, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ²Π°Π»ΠΈΠ²Π°ΡŽΡ‰ΠΈΠΉΡΡ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ создаСт экзСмпляр нСявно ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅ΠΌΠΎΠ³ΠΎ ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»Π° ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ Ρ‚ΠΈΠΏΠ°. Π‘Π΄Π΅Π»Π°Ρ‚ΡŒ это ΠΌΠΎΠΆΠ½ΠΎ, Ссли вмСсто Π²ΠΎΠΏΡ€ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ Π·Π½Π°ΠΊΠ° ΠΏΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π²ΠΎΡΠΊΠ»ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Π·Π½Π°ΠΊ послС ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ слова init (init!).

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π΅Π»Π΅Π³ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΡ‚ init? Π² init! ΠΈ Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚, Π° Ρ‚Π°ΠΊ ΠΆΠ΅ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ init? с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ init! ΠΈ Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚. Π’Ρ‹ Ρ‚Π°ΠΊ ΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π΅Π»Π΅Π³ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΡ‚ init Π² init!, хотя, дСлая Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΌΡ‹ заставим ΡΡ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½ΠΈΠ΅, Ссли init! ΠΏΡ€ΠΎΠ²Π°Π»ΠΈΡ‚ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ.

Π’Ρ€Π΅Π±ΡƒΠ΅ΠΌΡ‹Π΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Ρ‹

ΠΠ°ΠΏΠΈΡˆΠΈΡ‚Π΅ required ΠΏΠ΅Ρ€Π΅Π΄ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° класса, Ссли Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ подкласс этого класса Π±Ρ‹Π» обязан Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ этот ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€:


class SomeClass {
    required init() {
      //пишСм Ρ‚ΡƒΡ‚ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°
    }
}

Π’Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ required ΠΏΠ΅Ρ€Π΅Π΄ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΠΎΠ³ΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° класса для ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ†ΠΈΠΈ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ подкласс Ρ‚Π°ΠΊ ΠΆΠ΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡƒΠ½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ этот ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ ΠΏΠΎ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ΅. Π’Ρ‹ Π½Π΅ ΠΏΠΈΡˆΠ΅Ρ‚Π΅ override, ΠΊΠΎΠ³Π΄Π° пСрСопрСдСляСтС Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΡ‹ΠΉ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€:


class SomeSubclass: SomeClass {
    required init() {
      //пишСм Ρ‚ΡƒΡ‚ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° подкласса
    }
}

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

Π’Ρ‹ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°Ρ‚ΡŒ ΡΠ²Π½ΡƒΡŽ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΠΎΠ³ΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°, Ссли Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΠ΄ΠΎΠ²Π»Π΅Ρ‚Π²ΠΎΡ€ΠΈΡ‚ΡŒ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠ΅ унаслСдованным ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠΌ.

ΠΠ°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ свойства Π² Π²ΠΈΠ΄Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠ»ΠΈ замыкания

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

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

НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° схСма Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ свойству:


class SomeClass {
    let someProperty: SomeType = {
      // создаСм Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ΅ значСния для SomeProperty Π²Π½ΡƒΡ‚Ρ€ΠΈ этого замыкания
      // someValue Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ Ρ‚ΠΈΠΏΠ°, Ρ‡Ρ‚ΠΎ ΠΈ SomeType
      return someValue
    }()
} 

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

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

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

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π½ΠΈΠΆΠ΅ опрСдСляСт структуру Chessboard, которая ΠΌΠΎΠ΄Π΅Π»ΠΈΡ€ΡƒΠ΅Ρ‚ доску для ΠΈΠ³Ρ€Ρ‹ β€œΠ¨Π°ΡˆΠΊΠΈβ€:

Π’ ΠΈΠ³Ρ€Ρƒ шашки ΠΈΠ³Ρ€Π°ΡŽΡ‚ Π½Π° доскС 8Ρ…8, с Ρ‡Π΅Ρ€Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌΠΈΡΡ Ρ‡Π΅Ρ€Π½Ρ‹ΠΌΠΈ ΠΈ Π±Π΅Π»Ρ‹ΠΌΠΈ ΠΊΠ»Π΅Ρ‚ΠΊΠ°ΠΌΠΈ. Для отобраТСния ΠΈΠ³Ρ€Π°Π»ΡŒΠ½ΠΎΠΉ доски для этой ΠΈΠ³Ρ€Ρ‹, структура Chessboard ΠΈΠΌΠ΅Π΅Ρ‚ СдинствСнноС свойство boardColors, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ являСтся массивом ΠΈΠ· 64Β Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Ρ‚ΠΈΠΏΠ° Bool. Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ true ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚ Ρ‡Π΅Ρ€Π½Ρ‹Π΅ ΠΊΠ»Π΅Ρ‚ΠΊΠΈ, false - Π±Π΅Π»Ρ‹Π΅. ΠŸΠ΅Ρ€Π²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ массива ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚ Π»Π΅Π²Ρ‹ΠΉ Π²Π΅Ρ€Ρ…Π½ΠΈΠΉ ΡƒΠ³ΠΎΠ» доски, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ послСднСго элСмСнта ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚ ΠΏΡ€Π°Π²Ρ‹ΠΉ Π½ΠΈΠΆΠ½ΠΈΠΉ ΡƒΠ³ΠΎΠ» доски.

Массив boardColors ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ замыкания для установки Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Ρ†Π²Π΅Ρ‚ΠΎΠ²:


struct Chessboard {
    let boardColors: [Bool] = {
        var temporaryBoard = [Bool]()
        var isBlack = false
        for i in 1...8 {
            for j in 1...8 {
                temporaryBoard.append(isBlack)
                isBlack = !isBlack
            }
            isBlack = !isBlack
        }
        return temporaryBoard
    }()
    func squareIsBlackAt(row: Int, column: Int) -> Bool {
        return boardColors[(row * 8) + column]
    }
}

Когда Π±Ρ‹ Π²Ρ‹ ни создали Π½ΠΎΠ²Ρ‹ΠΉ экзСмпляр Chessboard, Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ исполняСтся, ΠΈ Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ boardColors высчитываСтся ΠΈ возвращаСтся. Π—Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π²Ρ‹ΡˆΠ΅ высчитываСт Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΉ массив temporaryBoard ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π΅Π³ΠΎ Π² качСствС Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ значСния Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ΠΌ, ΠΊΠ°ΠΊ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ½ вСсь заполняСтся. Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½Π½Ρ‹ΠΉ массив сохраняСтся Π² boardColors ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π·Π°ΠΏΡ€ΠΎΡˆΠ΅Π½ Ρ‡Π΅Ρ€Π΅Π· ΠΌΠ΅Ρ‚ΠΎΠ΄ squareIsBlackAt:


let board = Chessboard()
print(board.squareIsBlackAt(row: 0, column: 1))
// Π’Ρ‹Π²Π΅Π΄Π΅Ρ‚ "true"
print(board.squareIsBlackAt(row: 7, column: 7))
// Π’Ρ‹Π²Π΅Π΄Π΅Ρ‚ "false"
Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΠ΅
Руководство ΠΏΠΎ Swift