从`compactMap()`闭包返回`nil`失败结果类型检查

问题描述 投票:0回答:1

在此片段中,我尝试将

[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
值。上面的片段有什么问题?

ios swift functional-programming
1个回答
0
投票

事实证明 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
            )
        }
    }

© www.soinside.com 2019 - 2024. All rights reserved.