我正在尝试在具有一些通用项的结构上实现自定义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
// ..
答案 0 :(得分:2)
Something
不符合NSObject
。
Swift 4通过查看包含U
的所有参数,自动推断flatMap
函数中使用的泛型参数U
的约束。 U
用作Wrapper
的通用参数,需要U: NSObject
。 Something
不是NSObject
的子类。
错误信息只是误导。