Swift自定义flatMap实现导致错误无法推断通用参数

时间:2017-07-14 13:08:03

标签: swift generics

我正在尝试在具有一些通用项的结构上实现自定义flatMapflatMap只使用提供的转换函数对项目进行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
    // .. 

1 个答案:

答案 0 :(得分:2)

Something不符合NSObject

Swift 4通过查看包含U的所有参数,自动推断flatMap函数中使用的泛型参数U的约束。 U用作Wrapper的通用参数,需要U: NSObjectSomething不是NSObject的子类。

错误信息只是误导。

相关问题