Swift 3.0 не может преобразовать значение типа (_, _)-›() в ожидаемый тип аргумента «ObjectsOrErrorBlock»

Я использовал typedef в target-c для определения блока завершения следующим образом:

typedef void(^ObjectsOrErrorBlock) (NSArray* objects, NSError* error);

Затем у меня есть функция Swift 3.0, которая принимает ObjectsOrErrorBlock в качестве параметра. Когда я пытаюсь использовать функцию, я получаю сообщение об ошибке, упомянутое в заголовке. Вот как я пытаюсь это назвать:

BPDKAPIClient.shared().getLeadSources({ (leadSourceNames, error) in

    self.replaceAll(leadSourceNames.flatMap({$0}))
})

Вот как Xcode автоматически заполняет мою функцию:

BPDKAPIClient.shared().getLeadSources { ([Any]?, Error?) in
    code
}

Что не так с тем, как я вызываю функцию? Как я должен называть это?

Таким образом, было указано, что вопрос похож на: from swift, где решение было методом экземпляра, вызывается для объекта, не являющегося экземпляром (также известного как BPDAPIClient). Функция shared() фактически возвращает экземпляр instancetype, поэтому метод getLeadSources вызывается не для объекта, не являющегося экземпляром, а для некоторого экземпляра. Вот как определяется общий доступ:

+ (instancetype) sharedClient;

+ (instancetype)sharedClient {

    static BPDKAPIClient *sharedMyManager = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        sharedMyManager = [[self alloc] init];

        // Set the client configuration to be the default.
        BPDKAPIClientConfiguration* defaultConfig =     [BPDKAPIClientConfiguration defaultConfiguration];
        [sharedMyManager setApiClientConfig:defaultConfig];
        [sharedMyManager setAppSource:@""];
    });

    //TODO: add logic to allow first pass at shared manager to be allowed, but subsuquent must check that we called "setAppId:ClientKey:Environment"

    return sharedMyManager;
}

person Minimi    schedule 05.10.2016    source источник
comment
Возможный дубликат Вызов блока target-C typedef из swift   -  person slf    schedule 06.10.2016
comment
Я так не думаю, они определенно похожи, но предоставленный ответ не решил мою проблему.   -  person Minimi    schedule 06.10.2016
comment
Смотрите мой обновленный вопрос   -  person Minimi    schedule 06.10.2016
comment
Зависит от того, как вы объявили свой replaceAll. Требуется ли [Any]?, который возвращает leadSourceNames.flatMap({$0})?   -  person OOPer    schedule 06.10.2016
comment
Требуется [Строка]! но даже тогда ошибка выдается в ...Client.shared().getLeadSources({ (leadSourceNames, error) в... строке, она все еще существует, даже если я закомментирую содержимое.   -  person Minimi    schedule 06.10.2016
comment
ПРОСТО ШУЧУ! Я предполагаю, что ошибка просто не исчезла после того, как я закомментировал содержимое, но я попытался скомпилировать ее после удаления replaceAll, и это сработало, что означает, что это основная причина. Я не понимаю, почему это вызвало проблему, можете ли вы объяснить? @OOPer   -  person Minimi    schedule 06.10.2016


Ответы (1)


Итак, судя по комментариям

"Зависит от того, как вы объявили свой replaceAll. Требуется ли [Any]? который возвращает leadSourceNames.flatMap({$0})?"

что указало мне на то, что содержимое блока было неверным, что привело к возникновению ошибки. Это странно, потому что ошибка указывает на начало блока, а не на содержимое, вы могли бы подумать, что это говорит о несовместимых типах.

person Minimi    schedule 12.10.2016