Расширение универсального класса Objective C не может получить доступ к универсальным параметрам класса во время выполнения - PullRequest
0 голосов
/ 24 апреля 2018

У меня есть NSFetchedResultsController расширение:

extension NSFetchedResultsController
{
    func tryObjectAtIndex(_ indexPath: IndexPath) throws -> AnyObject // ERROR HERE
    {
        do
        {
            try ObjC.catchException
            {
                return self.object(at: indexPath) // CAUSE
            }
        }
        catch
        {
            print("An error ocurred: \(error)")
        }
    }
}

, в котором ObjC является классом Objective-C (от здесь ). Вот это .h:

#import <Foundation/Foundation.h>

@interface ObjC : NSObject

+ (BOOL)catchException:(void(^)())tryBlock error:(__autoreleasing NSError **)error;

@end

И .m:

@implementation ObjC

+ (BOOL)catchException:(void(^)())tryBlock error:(__autoreleasing NSError **)error
{
    @try
    {
        tryBlock();
        return YES;
    }
    @catch (NSException *exception)
    {
        *error = [[NSError alloc] initWithDomain:exception.name code:0 userInfo:exception.userInfo];
        return NO;
    }
}

@end

При tryObjectAtIndex появляется ошибка Extension of a generic Objective-C class cannot access the class's generic parameters at runtime.

Единственный ответ на связанный вопрос 'Как написать расширение для NSFetchedResultsController в Swift 4' предлагает добавить @objc перед функцией. Но в приведенном выше коде это не имеет никакого значения.

Вызов self.object(at:) вызывает эту проблему. Но на самом деле, без обработки исключений Objective-C, так что просто return self.object(at: indexPath) в качестве тела функции ошибка не возникает.

Как мне решить эту проблему?

ВАЖНО: Я нахожусь на Xcode 8.3.2 и не могу сейчас обновить (так как это устаревший проект).

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