2016-11-26 15 views
22

Swift 3でこのコードブロックを実行しようとすると、2つの 'Double'オペランドに2進演算子 '/'を適用できません。2つの 'Double'オペランドに2進演算子 '/'を適用できません

var array2 = [8, 7, 19, 20] 

for (index, value) in array2.enumerated() { 
    array2[index] = Double(value)/2.0 
} 

は、まだこれは

var array2 = [Double]() 
array2 = [8, 7, 19, 20] 

for (index, value) in array2.enumerated() { 
    array2[index] = value/2.0 
} 

に動作しないのはなぜコード作業の最初のブロック?

答えて

26

エラーは少し誤解を招くことがあります。

コードの最初のセットでは、array2が暗黙的にIntの配列として宣言されています。だから、array2のインデックスに値を代入しようとすると、Intの値が必要になります。

Double(value)/2.0の結果は、Intではなく、Doubleという値になります。したがって、コンパイラはIntを返す/のバージョンを探しています。そして、そのバージョンは2つのパラメータを期待しています:Int。あなたは2つのDoubleパラメータを供給しているので、質問に記載されているエラーが発生します。

解決策は、結果をIntにキャストするか、2つのIntパラメータを/に使用することです。

var array2 = [8, 7, 19, 20] 

for (index, value) in array2.enumerated() { 
    array2[index] = Int(Double(value)/2.0) // cast to Int 
} 

又は

var array2 = [8, 7, 19, 20] 

for (index, value) in array2.enumerated() { 
    array2[index] = value/2 // Use two Int 
} 

結果は、この場合には同じです。 84に置き換えられます。 73などで置き換えられます。

Doubleですべての配列が正しいタイプと一致するように配列を宣言するので、2番目のコードセットはそのまま動作します。

+0

グレート答えは、ありがとうございました。 –

+1

誤解を招くSwiftコンパイラエラーを愛してください:/ – shelll

+1

'Int(...) 'はキャストではありません - あなたはSwiftの異なる数値型の間でキャストできません。 'Int'のイニシャライザを使った*変換*です。 – Hamish

2

最初の配列はIntなのでarray2.enumerated()valueとなり、Intとなります。これを行うと、Double(value)/2.0が返され、最終的な結果は配列タイプと互換性のないタイプDoubleになります。 1秒間

しかし、あなたは明示的に操作が問題なく動作を行うDoubleとしてDoubleので、array2.enumerated()リターンvalueの配列を宣言しました。

1

rmaddyの答えが正しい理由は、暗黙のInt宣言です。完全性のために。これを修正するにはいくつかの方法があります。キャストは1つです。ここではまだ言及していないものは、このケースを含めるためにDoubleを拡張することです。これを十分に行う必要がある場合は、Double/Intの独自のバージョンを定義し、Swiftが独自の関数内でどのように処理するかを制御できます。

extension Double { 
    static func/(left: Double, right: Int) -> Double { 
     return left/Double(right) 
    } 
} 

あなたはいつものInt /ダブル逆のケースを扱う別の機能などを追加することができます...

+0

新しいもの!これを使う方法は? – Hemang

関連する問題