2017-07-05 6 views
1

スウィフト3のコンパイラでは、私は次のようにコンパイルさせません:Sequenceプロトコルに準拠していないため、範囲の配列に対してどのように反復処理を行うのですか?

let a = 0 
let b = 10 
var arr = [ClosedRange<Int>]() 
let myRange: ClosedRange = a...b 
arr.append(myRange) 

for each in arr { 
    for every in each { 
     print(every) 
    } 
} 

... ClosedRange<Int>に。

extension ClosedRange<Int>: Sequence {} 

...しかし、今、コンパイラは、拡張子が、私は私はと思いますwhere句、と宣言することを求められます。過去には、そのようなクラスへの単純な拡張は十分だっただろうこれについてはすべて間違っています。私は何が欠けていますか?

答えて

4

問題は、範囲の配列を有することではなく、スイフト3と ClosedRange

下部まで結合から

匹敵タイプ上間隔、などを含む、上限を表します。例えば

、閉じた範囲はすべての可能な値を列挙することはあまり意味がないDouble

let r: ClosedRange<Double> = 1.1...2.2 

と共に使用することができます。あなたが必要なもの

連続した値のコレクションを形成して閉じた範囲でCountableClosedRangeあります。

、特に収集され、繰り返し処理することができます。

let a = 0 
let b = 10 
var arr = [CountableClosedRange<Int>]() 
let myRange: CountableClosedRange = a...b 
arr.append(myRange) 

for each in arr { 
    for every in each { 
     print(every) 
    } 
} 

オペランドた場合、デフォルトでは、...オペレータはCountableClosedRange を生成するのであなただけ

let myRange = a...b 

を書くことができますStrideableです。

同様に、半開きの範囲についてはRangeおよびCountableRangeです。 詳細については、Range TypesSE-0065 A New Model for Collections and Indicesに記載しています。

+0

Aha!私は間違ったデータ型を持っていました。私はこの一日のハングを取得します。ありがとう、@MartinR! –

1
let a = 0 
    let b = 10 
    var arr = [ClosedRange<Int>]() 
    let myRange: ClosedRange = a...b 
    arr.append(myRange) 

    for each in arr { 
     for every in [Int](each.lowerBound..<each.upperBound) { 
      print(every) 
     } 
    } 

この拡張を削除します。

+0

これも可能です。範囲内のすべての整数値の*一時配列*を作成することに注意してください。 –

関連する問題