在此片段中,我尝试将
[RegisteredMediaAttachment]
映射到 [BasicAttachmentInput]
,但仅限于那些具有可解析 uploadUrl
的项目。
private func createSecondaryAttachments(
_ attachments: [RegisteredMediaAttachment]
) -> [BasicAttachmentInput] {
return attachments.compactMap {
guard let name = URL(string: $0.registration.uploadUrl) else {
return nil
}
return BasicAttachmentInput(
name: name,
contentType: $0.attachment.type.mime(),
sizeBytes: $0.attachment.data.count,
mediaId: $0.registration.media.id
)
}
}
然而,Swift 在线上抱怨
return nil
'nil' is not compatible with closure result type 'BasicAttachmentInput'
这让我很惊讶。我希望该函数能够编译并减少映射结果,使其仅包含从
nil
闭包返回的非 compactMap
值。上面的片段有什么问题?
事实证明 Swift 根本无法正确推断类型:只需使用隐含的返回类型注释
compactMap()
闭包即可解决问题:
private func createSecondaryAttachments(
_ attachments: [RegisteredMediaAttachment]
) -> [BasicAttachmentInput] {
return attachments.compactMap { (attachment: RegisteredMediaAttachment) -> BasicAttachmentInput?
// Note the explicit return type signature of the closure above ^
guard let name = URL(string: $0.registration.uploadUrl) else {
return nil
}
return BasicAttachmentInput(
name: name,
contentType: $0.attachment.type.mime(),
sizeBytes: $0.attachment.data.count,
mediaId: $0.registration.media.id
)
}
}