我试图在一个具有一些泛型项的结构上实现一个自定义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
用作需要Wrapper
的U: NSObject
的泛型参数。Something
不是NSObject
的子类。
错误信息只是误导。
关于swift - Swift自定义flatMap实现导致无法推断通用参数错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45103850/