いくつかの一般的な項目を持つ構造体にカスタムflatMap
を実装しようとしています。 flatMap
は、指定された変換関数を使用するアイテムに対してちょうどSwift.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
// ..
なぜ 'T 'に' NSObject'制約がありますか? 'Something'はプロトコルなので、' NSObject'から継承しないので、 'Wrapper'を持つことはできません。 –
Hamish
'extension UIView:Something {}'のようなコードのどこかに適合性があるかもしれません。その場合、キャストを試みるのが理にかなっています。 –
しかし 'struct Foo:Something'があったら?これは 'Something'にキャストできますが、' NSObject'を継承しません。本当に 'NSObject'制約が必要な場合は、' wrapper.flatMap {$ 0 as? NSObject&Something} '(Swift 4)を参照してください。 – Hamish