36
// Playground - noun: a place where people can play


func getAverage(numbers: Int...) -> Double{
    var total = 0
    var average:Double = 0

    for number in numbers{
        total = total + number
    }

    average = total / numbers.count

    return average
}

getAverage(3, 6)

エラーが発生しますaverage = total / numbers.count

指定された引数を受け入れる「/」のオーバーロードが見つかりませんでした

私は次のようにして修正しようとしました:

average = Double(total/numbers.count)

しかし、その後 getAverage は4代わりにに設定されました4.5

4

2 に答える 2

62

Swift にはそのような暗黙的な変換がないため、自分で明示的に変換する必要があります。

average = Double(total) / Double(numbers.count)

The Swift Programming Languageから: 「値は暗黙的に別の型に変換されることはありません。」(セクション: 迅速なツアー)

しかし、あなたは現在、Objective-C ではなく Swift を使用しているので、より機能指向の方法で考えてみてください。関数は次のように記述できます。

func getAverage(numbers: Int...) -> Double {
    let total = numbers.reduce(0, combine: {$0 + $1})
    return Double(total) / Double(numbers.count)
}

reduceアキュムレータ変数の初期値として最初のパラメータを取り、combine関数をアキュムレータ変数と配列内の各要素に適用します。$0ここでは、and を使用し$1て、渡された最初と 2 番目のパラメーターを示し、それらを加算する無名関数を渡します。

さらに簡潔に、次のように書くことができますnumbers.reduce(0, +)

型推論が、それtotalInt.

于 2014-06-02T23:30:54.010 に答える
6

コンパイラは、/入力パラメーターと出力パラメーターに基づいてオペレーターの実装を選択します。あなたの場合、入力パラメータは2つのInt値で、出力パラメータはDouble. これは、コンパイラが探しているものです。

func / (left: Int, right: Int) -> Double

ただし、/エラーが発生する理由は、そのような演算子の実装がないためです。を実行するDouble(total/numbers.count)と、出力パラメータが に変更されます。これが、存在する演算子Intに対してコンパイラが次の実装を選択する理由です。/

func / (left: Int, right: Int) -> Int

これが、結果を after に変換しても、結果4の代わりに取得する理由です。4.5Double

最初に数値をsに変換する演算子の独自の実装を提供できます。/Double

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

次に、次のことができます。

let a: Int = 3
let b: Int = 2
let c: Double = a/b  // -> 1.5
于 2014-06-08T12:36:33.957 に答える