英文:
Forced unwrapping inside flatMap in combine swift
问题
I am trying to do some forced unwrapping inside my flatMap function but getting following error on return nil line:
我在我的flatMap函数内尝试进行一些强制解包,但在return nil行时出现以下错误:
> 'nil' requires a contextual type
> 'nil'需要上下文类型
Following is my code:
以下是我的代码:
func fetchOrgs() -> AnyPublisher<[THOrganizationV2?], THError> {
let locale = userInformationProvider.defaultOrganizationLocale
let orgID = organizationProvider.currentOrganizationID ?? ""
return thProvider.fetchTHOrgs(locale: locale, orgID: orgID).flatMap { orgs in
guard let org = orgs.first else {
return nil// error here
}
if org.type == .xpert {
return self.prepareThURL(with: org, orgID: orgID)
}
return THOrganizationV2(serviceURL: URL(string: org.url), type: OrganizationType(rawValue: (org.type)!.rawValue) ?? .aaa, authenticationToken: org.authenticationToken)
}.eraseToAnyPublisher()
}
Signature of function called above in thProvider:
上面在thProvider中调用的函数的签名:
func fetchTHOrgs(locale: String, orgID: String?) -> AnyPublisher<[thOrganizationEntityV2], THError>
I have tried different combinations of map and flatMap but nothing seems to be working for me.
我尝试了不同的map和flatMap组合,但似乎没有任何方法适用于我。
Edit:
My goal here is to convert an array of thOrganizationEntityV2 to an array of THOrganizationV2 and handle forced unwrapping too.
编辑:
我的目标是将thOrganizationEntityV2数组转换为THOrganizationV2数组,并处理强制解包。
英文:
I am trying to do some forced unwrapping inside my flatMap function but getting following error on return nil line:
> 'nil' requires a contextual type
Following is my code:
func fetchOrgs() -> AnyPublisher<[THOrganizationV2?], THError> {
let locale = userInformationProvider.defaultOrganizationLocale
let orgID = organizationProvider.currentOrganizationID ?? ""
return thProvider.fetchTHOrgs(locale: locale, orgID: orgID).flatMap { orgs in
guard let org = orgs.first else {
return nil// error here
}
if org.type == .xpert {
return self.prepareThURL(with: org, orgID: orgID)
}
return THOrganizationV2(serviceURL: URL(string: org.url), type: OrganizationType(rawValue: (org.type)!.rawValue) ?? .aaa, authenticationToken: org.authenticationToken)
}.eraseToAnyPublisher()
}
Signature of function called above in thProvider:
func fetchTHOrgs(locale: String, orgID: String?) -> AnyPublisher<[thOrganizationEntityV2], THError>
I have tried different combinations of map and flatMap but nothing seems to be working for me.
Edit:
My goal here is to convert array of thOrganizationEntityV2 to array of THOrganizationV2 and wants to handle forced unwrapping too.
Signature for prepareThURL:
private func prepareThURL(with org: THOrganizationEntityV2, orgID: String?) -> THOrganizationV2?
答案1
得分: 1
以下是您要翻译的内容:
编译器正在查看flatMap
中的块,无法确定nil
代表的类型。
flatMap
运算符期望其闭包返回某种类型的Publisher
,而不是可选项。在您的情况下,flatMap
似乎是错误的运算符。您的代码似乎可能返回THOrganizationV2?
,这不是一个Publisher
。
在块中,编译器进行到这一步:
.flatMap { orgs in
guard let org = orgs.first else { return nil }
并说:“嗯...我在一个没有声明返回类型的闭包中,你给了我一个nil
。我不知道这是哪种类型的nil
。它是Int?
,Float?
,OmpaLoompa?
...我没有上下文来确定这个特定的nil
对应于什么类型。”
您可以通过为闭包声明返回类型来修复它:
.flatMap { orgs -> THOrganizationV2? in
guard let org = orgs.first else { return nil }
或直接为nil
提供上下文类型:
.flatMap { orgs in
guard let org = orgs.first else { return nil as THOrganizationV2? }
但再次强调,flatMap
发布器运算符期望返回类型是一个发布器。我认为您的THOrganizationV2
不是Publisher
。
从您的代码中看,似乎您想要的是这样的东西:
return thProvider
.fetchTHOrgs(locale: locale, orgID: orgID)
.map { orgs in
return orgs.map { org -> THOrganizationV2? in
guard let org = orgs.first else { nil }
if org.type == .xpert {
return self.prepareThURL(with: org, orgID: orgID)
}
return THOrganizationV2(
serviceURL: URL(string: org.url),
type: OrganizationType(rawValue: (org.type)!.rawValue) ?? .aaa,
authenticationToken: org.authenticationToken
)
}
}
(我将此输入到答案编辑器中,而不是编译器,所以可能需要一些工作)
我将flatMap
替换为map
。对于每个传入的orgs
数组,系统将其映射为一个THOrganizationV2?
数组,这些数组成为发布器的输出,因此fetchOrgs
应该与其类型签名匹配。
英文:
The compiler is looking at the block in the flatMap
and can't determine what type the nil
represents.
The flatMap
operator expects its closure to return a Publisher
of some sort, not an optional. In your case flatMap
seems to be the wrong operator. Your code seems like it might be returning THOrganizationV2?
which is not a Publisher
.
In the block the compiler gets this far:
.flatMap { orgs in
guard let org = orgs.first else { return nil }
and says "hmmm... I'm in a closure that has no declared return type and you're giving me a nil
. I don't know what flavor of nil
that is. Is it an Int?
, a Float?
, a OmpaLoompa?
... I have no context to figure out what Type that particular nil
corresponds to."
You might fix it by declaring a return type for the closure:
.flatMap { orgs -> THOrganizationV2? in
guard let org = orgs.first else { return nil }
or by directly providing a contextual type for the nil:
.flatMap { orgs in
guard let org = orgs.first else { return nil as THOrganizationV2? }
But once again, the flatMap
publisher operator expects the return type to be a publisher. I don't think your THOrganizationV2 is a Publisher
.
Looking at the type signatures in your code, it seems that what you might want is something like this:
return thProvider
.fetchTHOrgs(locale: locale, orgID: orgID)
.map { orgs in
return orgs.map { org -> THOrganizationV2? in
guard let org = orgs.first else { nil }
if org.type == .xpert {
return self.prepareThURL(with: org, orgID: orgID)
}
return THOrganizationV2(
serviceURL: URL(string: org.url),
type: OrganizationType(rawValue: (org.type)!.rawValue) ?? .aaa,
authenticationToken: org.authenticationToken
)
}
}
(I typed this into the answer editor, not a compiler so some work may be needed)
I've replaced flatMap
with map
. For each array of orgs
that come in, the system maps it to an array of THOrganizationV2?
and those become the output of the publisher so fetchOrgs
should match it's type signature.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论