Я не думаю, что это возможно, просто полагаясь на операции во время компиляции в Swift.Если вам важно, написав расширение в Objective-C, которое определяет метод, ваша реализация переопределит платформу, когда она существует, так что это может быть жизнеспособным и простым решением.
Если вы хотите, чтобы ваша реализация тольковключите, только если нет родного, вы также можете сделать это довольно легко в Objective-C.Во-первых, у меня есть два предупреждения:
- Вы модифицируете CoreData, который сам по себе уже довольно динамичен, и я не уверен, как он будет реагировать.
- Я не могу проверитьЛюбое из того, что я говорю на этом компьютере, поэтому прокомментируйте, если оно не работает:)
В заголовке моста убедитесь, что компилятор знает, что init(context:)
доступен независимо от iOSверсия:
@interface NSManagedObject ()
+(void)initialize;
-(instancetype)initWithContext:(NSManagedObjectContext* _Nonnull)ctx;
@end
+initialize
методы, объявленные в категориях, выполняются независимо от того, имеет ли класс сам метод +initialize
или если он есть у любой другой категории.
Тогда реализация будетвыглядят так:
@implementation NSManagedObject ()
static id initWithContext(NSManagedObject* self, SEL sel, NSManagedObjectContext* context) {
// your implementation goes here
}
+(void)initialize {
SEL init = @selector(initWithContext:);
if (![self instancesRespondToSelector:init]) {
class_addMethod(self, init, (IMP)initWithContext, "@:@");
}
}
@end
Что, на мой взгляд, довольно просто: проверьте, поддерживает ли NSManagedObject
initWithContext:
, и, если нет, добавьте свою собственную реализацию.Вам не нужно предоставлять явную реализацию initWithContext:
.