Подтвердить что ты не робот

Почему я не могу разделить целые числа в swift?

В документации Swift" Tour, в которой вы строите следующую функцию, чтобы усреднить набор чисел:

func sumOf(numbers: Int...) -> Int {
    var sum = 0
    for number in numbers {
        sum += number
    }
    return sum
}

Я могу сделать эту работу, используя что-то вроде следующего:

func averageOf(numbers: Double...) -> Double {
    var sum: Double = 0, countOfNumbers: Double = 0
    for number in numbers {
        sum += number
        countOfNumbers++
    }
    var result: Double = sum / countOfNumbers
    return result
}

Мой вопрос в том, почему я должен использовать все как двойное, чтобы заставить его работать? Если я попытаюсь работать с целыми числами, например:

func averageOf(numbers: Int...) -> Double {
    var sum = 0, countOfNumbers = 0
    for number in numbers {
        sum += number
        countOfNumbers++
    }
    var result: Double = sum / countOfNumbers
    return result
}

Я получаю следующую ошибку: Could not find an overload for '/' that accepts the supplied arguments

4b9b3361

Ответ 1

Кажется, что OP знает , как код должен выглядеть, но он явно спрашивает , почему он не работает другим способом.

Итак, "явно" является частью ответа, который он ищет: Apple пишет внутри "Руководства по языку" в главе "Основы" → "Целое и преобразование с плавающей запятой":

Конверсии между целыми числами и числами с плавающей запятой должны быть явно выраженный

Ответ 2

вам просто нужно сделать это:

func averageOf(numbers: Int...) -> Double {
    var sum = 0, countOfNumbers = 0
    for number in numbers {
        sum += number
        countOfNumbers++
    }
    var result: Double = Double(sum) / Double(countOfNumbers)
    return result
}

Ответ 3

Вы назначаете вывод / переменной типа Double, поэтому Swift считает, что вы хотите вызвать эту функцию:

func /(lhs: Double, rhs: Double) -> Double

Но аргументы, которые вы передаете, не являются Double, а Swift не выполняет неявное кастинг.

Ответ 4

который может быть helful:

func averageOf(numbers: Int...) -> Double {
    var sum = 0, countOfNumbers = 0
    for number in numbers {
        sum += number
        countOfNumbers++
    }
    var result: Double = Double(sum) / Double(countOfNumbers)
    return result
}

ИЛИ

перегрузка оператора / для значений Int также может быть решением:

func / (lhs: Int, rhs: Int) -> Double {
    return Double(lhs) / Double(rhs)
}

Ответ 5

Попробуйте это, но заметите, что swift не любит делить на целые числа, которые инициализируются нулем или могут стать нулевыми, поэтому вы должны использовать &/для принудительного деления. этот код немного подробный, но его легко понять, и он дает правильный ответ в целочисленном, не с плавающей запятой или двойном

func sumOf(numbers: Int...) -> Int {
var sum = 0
var i = 0
var avg = 1
for number in numbers {
    sum += number
    i += 1
}
avg = sum &/ i
return avg
}
sumOf()
sumOf(42, 597, 12)

Ответ 6

Нет причин вручную отслеживать количество аргументов, когда вы можете просто получить их напрямую.

func sumOf(numbers: Int...) -> Int {
    var sum = 0
    for number in numbers {
        sum += number
    }
    let average = sum &/ numbers.count
    return average
}

sumOf()
sumOf(42, 597, 12)

Ответ 7

Я не считаю необходимость для Принудительного отдела. Однако работает оператор нормального деления. В следующем коде

func average(numbers:Int...)->Float{
    var sum = 0
    for number in numbers{
        sum += number
    }
    var average: Float = 0
    average = (Float (sum) / Float(numbers.count))
    return average
}
let averageResult = average(20,10,30)
averageResult

Здесь два значения float делятся, конечно, после литья типов, так как я сохраняю результат в переменной float и возвращаю то же самое.

Примечание. Я не использовал дополнительную переменную для подсчета количества параметров. "числа" считаются массивом, так как функции в Swift принимают переменное количество аргументов в массив. "numbers.count" (аналогично Objective C) возвращает счетчик передаваемых параметров.