問題は、拡張機能が2D配列用であることをコンパイラーが認識していないことです。コレクションの配列用であることがわかります。したがって、関連するタイプIndexDistance
およびIndex
は必ずしもInt
である必要はありません。
ソリューションは、したがって、Element
のIndexDistance
とIndex
はタイプInt
のになるように、あなたの拡張機能を制限することです。これにより、範囲0..<count
が形成されます。はInt
(IndexDistance
)となり、の要素はInt
(下付き文字はIndex
となります)で下付き文字で入力することができます。
(あなたは、単にしかし、これはまだ不可能である、Array
するElement
を制約する可能性があり、これは、concrete same-type requirementsがサポートされれば行うことは些細なことだろう。)
あなたはまた、Element.Iterator.Element: Collection
あなたの制約に注意すべきです拡張子がコレクションの3D配列(要素がコレクションであり、そのコレクションの要素がコレクションである配列)に制約されるため、正しくありません。
最後に、Swiftが現在some limitations when working with nested types directlyを持っているので、たとえばそのタイプの空の2D配列を作成するときに、typealias
を定義して、2D配列の '内部要素'タイプを表す必要があります。
したがって、あなたの現在のメソッドの作業バージョンは、次のようになります
@MartinR points out belowとして、我々がないよう
typealias
の必要性を排除し、ネストされたを使用することによって大幅に簡略化することができ、
extension Array where Element: Collection, Element.Index == Int, Element.IndexDistance == Int {
private func rotate() -> [[Element.Iterator.Element]] {
typealias InnerElement = Element.Iterator.Element
// in the case of an empty array, simply return an empty array
if self.isEmpty { return [] }
let length = self[0].count
var returnValue = [[InnerElement]](repeating: [InnerElement](), count: length)
for index in 0..<length {
returnValue[index] = self.map{ $0[index] }.reversed()
}
return returnValue
}
}
を長い「結果」のアレイを作成する必要があります。その
private func rotate() -> [[Element.Iterator.Element]] {
if self.isEmpty { return [] }
let length = self[0].count
return (0..<length).map { index in
self.map { $0[index] }.reversed()
}
}
が、メモして、yの制約Int
インデックスでのみ機能する拡張は厳密には必要ではありません(2D配列でこれを使用することのみを意図しているので実用的な違いはありません)。もう一つの方法は、内部コレクションのindices
を直接反復することです。
これを行うためには、あなたは、単にインナーコレクションのIndices
は(Indices
がCountableRange<Int>
で、Array
の場合)コレクションのIndex
と同じタイプのElement
秒を持っているように、あなたの拡張を制限する必要があります。
extension Array where Element: Collection, Element.Indices.Iterator.Element == Element.Index {
private func rotate() -> [[Element.Iterator.Element]] {
if self.isEmpty { return [] }
return self[0].indices.map { index in
self.map { $0[index] }.reversed()
}
}
}
貴重な説明をありがとうございます。 – AfricanSwift
空の結果配列を最初に作成せずに、 'return(0 ..
ありがとうマーティン... – AfricanSwift