struct Hoge<T> { let value: T } extension Hoge where T: BidirectionalCollection { func fuga() -> T.Iterator.Element { return value.first! } } Hoge(value: [1, 2, 3]).fuga() // 1extension Hoge where T: RangeReplaceableCollection { }と書いておけば、その中でT.initが使えるようになるBidirectionalCollectionはよく使うんだけどなんだったかな、lastが欲しいので使ってた気がする。