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

sss*_*ver 2 functional-programming swift

在此代码片段中,我尝试映射[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
            )
        }
    }
Run Code Online (Sandbox Code Playgroud)

然而,斯威夫特在网上抱怨return nil'nil' is not compatible with closure result type 'BasicAttachmentInput'

这让我很惊讶。我希望该函数编译并减少映射结果以仅包含nilcompactMap闭包返回的非值。上面的片段有什么问题?

sss*_*ver 5

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

Run Code Online (Sandbox Code Playgroud)