Call Objective C пользовательская функция инициализации от Swift

Класс A написан в Objective C и имеет пользовательский init fucntion

@interface A ()

....

@end

@implementation A

- (id)customInitImplementedInA
{
    ... 
    return self;
}

Класс B наследует от класса A и использует этот пользовательский init следующим образом:

@interface B : A ()

....

@end

@implementation B
+(instancetype)instanceB{
    B *b = [[B alloc] customInitImplementedInA];
    ...
    return b;
}

Теперь я хотел бы создать класс C writen в Swift, который вдыхает A и использует ту же функцию init. Как мне это сделать?

class C: A {
  //How do I use customInitImplementedInA here?
}
0
задан Luda 13 August 2018 в 15:50
поделиться

2 ответа

Вы должны иметь возможность сделать это с помощью синтаксиса super.methodname.

class C: A {
    init() {
        super.customInitImplementedInA()
        // Any extra initialization for C goes here.
    }
}
1
ответ дан jlowe 15 August 2018 в 16:59
поделиться
  • 1
    получена ошибка для переопределения: Initializer не переопределяет назначенный инициализатор из своего суперкласса. Удалено и получено сообщение об ошибке для customInitImplementedInA: Значение типа 'A' не имеет имени пользователя customInitImplementedInA ' – Luda 13 August 2018 в 16:35
  • 2
    Виноват. Если класс A не имеет базового init, тогда вам не потребуется переопределение. Является ли customInitImplementedInA открытым через интерфейс или является ли он приватным? Если он закрыт, вы не сможете получить к нему доступ. – jlowe 13 August 2018 в 16:43
  • 3
    Он действительно доступен через интерфейс. Не могу себе представить, почему возникает эта ошибка – Luda 13 August 2018 в 16:46
  • 4
    Имеет ли customInit параметры и вы вызываете инициализатор с правильным быстрым синтаксисом? Когда вы делаете супер. делает ли автозаполнение все, что связано с методами класса А? – jlowe 13 August 2018 в 16:52

Если вы наследуете свой быстрый класс от Obj-C, то ваши быстрые класы будут иметь obj-c init (). если вам нужно его вызвать, вы можете включить его в свой быстрый init.

 class C: A {

        var message: B?

        init(message: B) {
            super.customInitImplementedInA()

            self.message = message

        }
    }
0
ответ дан swift2geek 15 August 2018 в 16:59
поделиться
  • 1
    Что такое сообщение var: B? – Luda 13 August 2018 в 16:33
  • 2
    его просто пример вашего пользовательского init. может быть любой var из вашего класса C. – swift2geek 13 August 2018 в 18:43

Другие вопросы по тегам:

Похожие вопросы: