Используйте NSProxy в Swift 4.1

Как создать подкласс NSProxy в Swift?

Попытка добавить любой из методов init завершается с ошибкой: "Super init не может быть вызван вне инициализатора" или "Super init не вызывается на всех путях перед возвратом из инициализатора"

error1 error2

Использование подкласса Objective-C в качестве базового класса работает, но больше похоже на взлом:

// Create a base class to use instead of `NSProxy`
@interface WorkingProxyBaseClass : NSProxy
- (instancetype)init;
@end

@implementation WorkingProxyBaseClass
- (instancetype)init
{
  if (self) {

  }
  return self;
}
@end



// Use the newly created Base class to inherit from in Swift
import Foundation

class TestProxy: WorkingProxyBaseClass {
  override init() {
    super.init()
  }
}

person Richard Topchii    schedule 18.04.2018    source источник
comment
stackoverflow.com/questions/36478679/   -  person Martin R    schedule 18.04.2018
comment
@MartinR, похоже, старый вопрос, интересно, изменилось ли что-нибудь?   -  person Richard Topchii    schedule 18.04.2018
comment
Очевидно нет ..,   -  person Martin R    schedule 18.04.2018
comment
Это известная ошибка: bugs.swift.org/browse/SR-1715.   -  person Martin R    schedule 18.04.2018
comment
@MartinR спасибо за упоминание. Я нашел пару обходных путей и, возможно, скоро опубликую их здесь.   -  person Richard Topchii    schedule 18.04.2018
comment
Я думаю, что большинство разработчиков не понимают NSProxy или даже не знают о его существовании. Тем не менее, я думаю, что это должно быть исправлено.   -  person I make my mark    schedule 07.11.2019


Ответы (1)


NSProxy — это абстрактный класс. В документах Apple о NSProxy говорится: «Абстрактный суперкласс, определяющий API для объектов, которые действуют как заменители для других объектов или для объектов, которые еще не существуют».

Документы об абстрактном классе википедии говорят:

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

Calling super.init() для абстрактного класса неверно. Во втором классе вы вызываете не super.init() для абстрактного класса, а WorkingProxyBaseClass, который является конкретным классом. В Objective c вы не вызывали [super init], поэтому код работает.

person Abhiraj Kumar    schedule 16.07.2019
comment
Вопрос все еще открыт. Как создать экземпляр подкласса NSProxy в Swift? - person Richard Topchii; 16.07.2019