Почему двухфазная инициализация не работает для класса в Swift? - PullRequest
0 голосов
/ 14 января 2019

Я начал изучать swift и найти урок под названием двухфазная инициализация. Пример приведен для структуры, и он правильно работает для нее. Пример для типа структуры приведен ниже:

import UIKit

struct NuclearRocket{
var meters: Double
var liters: Double

init(meters: Double, liters: Double){
    self.meters = meters
    self.liters = liters
    }
init(ft: Double, gallon: Double){
    let convertedMeters = ft / 3.28
    let convertedLiters = gallon * 3.78
    self.init(meters: convertedMeters , liters: convertedLiters)
        }
    }

var rocket = NuclearRocket(meters: 20, liters: 20)
rocket.liters
rocket.meters

var newRocket = NuclearRocket(ft: 2, gallon: 3)
newRocket.meters
newRocket.liters

Работает правильно и показывает точный результат. Но когда я заменяю struct на class (используя class NuclearRocket вместо struct NuclearRocket ), мой компилятор сказал мне, что:

Designated initializer for 'NuclearRocket' cannot delegate (with 'self.init'); did you mean this to be a convenience initializer? 

Какая на самом деле разница между использованием класса и структуры в этом случае?

1 Ответ

0 голосов
/ 14 января 2019

В классе Swift указанный инициализатор не может вызвать другой назначенный инициализатор сам по себе. Назначенный инициализатор в классе может вызывать только назначенный инициализатор своего суперкласса (если он есть).

В классе Swift удобный инициализатор может вызывать только назначенный инициализатор для себя (но не для суперкласса, если он есть).

Эти правила класса возникают из-за наследования классов. Правила применяются, даже если в вашем классе нет суперкласса. Все это описано в книге Swift в разделе Наследование классов и инициализация .

.

Ваш код как класс будет работать, если вы измените инициализатор init(ft: Double, gallon: Double) на удобный инициализатор.

Структура Swift имеет немного другие правила, так как структура не поддерживает наследование. Структуре не нужно использовать удобные инициализаторы, поэтому ваш оригинальный структурный код работал. Все это описано в книге Swift в разделе Делегирование нитализатора для типов значений .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...