我试图在一个具有一些泛型项的结构上实现一个自定义flatMap。使用所提供的转换函数,flatMap只会Swift.flatMap覆盖项。这里的代码有点做作,但它让我困惑,为什么标准库版本不会导致错误,但我的版本会导致错误。
我的flatMap实现中是否缺少什么?

struct Wrapper<T:NSObject> {

    let items:[T]

    func flatMap<U>(_ transform:(T) -> U?) -> Wrapper<U> {
        let newItems = items.flatMap { transform($0) }
        return Wrapper<U>(items: newItems)
    }
}

protocol Something {}

let wrapper = Wrapper<UIView>(items: [UIView()])

// Using standard library flatMap
wrapper
    .items
    .flatMap { $0 as? Something } // ✅ No error
    // ..

// Using custom flatMap
wrapper
    .flatMap { $0 as? Something } // 🛑 ERROR: Generic parameter 'U' could not be inferred
    // ..

最佳答案

Something不符合NSObject
Swift 4通过查看包含U的所有参数,自动推断flatMap函数中使用的通用参数U的约束。U用作需要WrapperU: NSObject的泛型参数。Something不是NSObject的子类。
错误信息只是误导。

关于swift - Swift自定义flatMap实现导致无法推断通用参数错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45103850/

10-12 22:35