Swift 自定义 flatMap 实现导致错误 Generic parameter could not be inferred

标签 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
    // .. 

最佳答案

Something 不符合 NSObject

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

错误信息只是误导。

关于Swift 自定义 flatMap 实现导致错误 Generic parameter could not be inferred,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45103850/

相关文章:

ios - 使用 UIScrollView 中的动态内容调整 UiView 高度(Swift)

ios - 带有托管内容的应用内购买在直播时不起作用

ios - Swift:符合带有 "where"子句的通用方法协议(protocol)

java - "?"的类型删除是什么?

C# 泛型类类型参数(无法隐式转换)

从枚举中提取 Swift 2 值

swift - 替换 View 时, cocoa 窗口大小加倍

swift - 如何从协议(protocol)函数中调用 reloadData()

c# - 强制转换为通用接口(interface)返回 null

generics - 具有通用约束的类型扩展不会引发错误,也不会执行预期的操作