Swift 3.0은 (_, _)-> () 유형의 값을 예상 인수 유형 'ObjectsOrErrorBlock'으로 변환 할 수 없습니다.

최저한의

object-c에서 typedef를 사용하여 다음과 같이 완료 블록을 정의했습니다.

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

그런 다음 ObjectsOrErrorBlock을 매개 변수로 사용하는 Swift 3.0 함수가 있습니다. 기능을 사용하려고하면 제목에 언급 된 오류가 발생합니다. 이것이 내가 그것을 부르는 방법입니다.

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

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

이것이 Xcode가 내 기능을 자동 완성하는 방법입니다.

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

함수를 호출하는 방식에 어떤 문제가 있습니까? 어떻게 불러야합니까?

따라서 질문은 다음과 유사하다는 점이 지적되었습니다 . 솔루션이 인스턴스 메서드 인 swift 에서 Objective-C typedef 블록 호출이 비 인스턴스 객체 (일명 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;
}
최저한의

그래서 댓글에서

"replaceAll을 선언 한 방법에 따라 다릅니다. [Any]가 필요합니까? 어떤 leadSourceNames.flatMap ({$ 0})이 반환합니까?"

이것은 블록의 내용이 잘못되어 오류가 발생한다는 것을 지적했습니다. 오류가 내용이 아닌 블록의 시작을 가리 키기 때문에 이상합니다. 호환되지 않는 유형이라고 생각할 수 있습니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관