Swift 3.0 无法将类型 (_, _)->() 的值转换为预期的参数类型 'ObjectsOrErrorBlock'
Swift 3.0 cannot convert value of type (_, _)->() to Expected argument type 'ObjectsOrErrorBlock'
我在 objective-c 中使用了 typedef 来定义完成块,如下所示:
typedef void(^ObjectsOrErrorBlock) (NSArray* objects, NSError* error);
然后我有一个 Swift 3.0 函数,它将 ObjectsOrErrorBlock 作为参数。当我尝试使用该功能时,我收到标题中提到的错误。这就是我试图称呼它的方式:
BPDKAPIClient.shared().getLeadSources({ (leadSourceNames, error) in
self.replaceAll(leadSourceNames.flatMap({[=13=]}))
})
这就是 Xcode 自动填充我的函数的方式:
BPDKAPIClient.shared().getLeadSources { ([Any]?, Error?) in
code
}
我调用函数的方式有什么问题?我应该怎么称呼它?
所以有人指出问题类似于:
Calling objective-C typedef block from swift
解决方案是在 non-instance object(又名 BPDAPIClient)上调用实例方法。 shared() 函数实际上是 returns instancetype 的一个实例,因此 getLeadSources 方法不会在 non-instance object 上被调用,而是在某个实例上被调用。 shared 是这样定义的:
+ (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;
}
所以从评论中,
"Depends on how you declared your replaceAll. Does it take [Any]? which leadSourceNames.flatMap({[=16=]}) returns?"
这让我指出块的内容不正确导致抛出错误。这很奇怪,因为错误指向块的开头,而不是内容,你会认为它会说不兼容的类型。
我在 objective-c 中使用了 typedef 来定义完成块,如下所示:
typedef void(^ObjectsOrErrorBlock) (NSArray* objects, NSError* error);
然后我有一个 Swift 3.0 函数,它将 ObjectsOrErrorBlock 作为参数。当我尝试使用该功能时,我收到标题中提到的错误。这就是我试图称呼它的方式:
BPDKAPIClient.shared().getLeadSources({ (leadSourceNames, error) in
self.replaceAll(leadSourceNames.flatMap({[=13=]}))
})
这就是 Xcode 自动填充我的函数的方式:
BPDKAPIClient.shared().getLeadSources { ([Any]?, Error?) in
code
}
我调用函数的方式有什么问题?我应该怎么称呼它?
所以有人指出问题类似于: Calling objective-C typedef block from swift 解决方案是在 non-instance object(又名 BPDAPIClient)上调用实例方法。 shared() 函数实际上是 returns instancetype 的一个实例,因此 getLeadSources 方法不会在 non-instance object 上被调用,而是在某个实例上被调用。 shared 是这样定义的:
+ (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;
}
所以从评论中,
"Depends on how you declared your replaceAll. Does it take [Any]? which leadSourceNames.flatMap({[=16=]}) returns?"
这让我指出块的内容不正确导致抛出错误。这很奇怪,因为错误指向块的开头,而不是内容,你会认为它会说不兼容的类型。