Инициализатор для условного связывания должен иметь необязательный тип, а не Int - PullRequest
0 голосов
/ 22 октября 2018
if let hrAverage: Int = (oldHR1+oldHR2+oldHR3+oldHR4+heartRate!)/5 {
    print(hrAverage)
} else {
     let hrAverage = (oldHR1+oldHR2+oldHR3+oldHR4) / 4
     print(hrAverage)
}

Получение этой ошибки:

"Инициализатор для условного связывания должен иметь необязательный тип, а не Int"

Я застрял на том, какизбавиться от этого.Я должен развернуть значение heartRate, используя необязательную привязку.

Ответы [ 3 ]

0 голосов
/ 22 октября 2018

(oldHR1+oldHR2+oldHR3+oldHR4+heartRate!)/5 не создает необязательный параметр, который требуется для использования оператора if let.

Я предлагаю вам сделать следующее:

let average = {
    if let rate = heartRate {
        return (oldHR1 + oldHR2 + oldHR3 + oldHR4 + rate) / 5
    } else {
        return (oldHR1 + oldHR2 + oldHR3 + oldHR4) / 4
    }    
}()

Теперь у вас есть переменная, котораявы можете использовать вне вашего if заявления.Если вам это не нужно, вы можете придерживаться следующего решения:

if let rate = heartRate {
    let average = (oldHR1 + oldHR2 + oldHR3 + oldHR4 + rate) / 5
} else {
    let average = (oldHR1 + oldHR2 + oldHR3 + oldHR4) / 4
}
0 голосов
/ 22 октября 2018

Нумерованные имена переменных, такие как oldHR1, oldHR2 и т. Д., Являются очень хорошим признаком того, что вы должны использовать массив.В этом случае я бы порекомендовал вам извлекать это вычисление среднего значения в его собственные типы данных, что облегчает и облегчает обработку этих данных.

struct RunningAverage {
    let maxSize: Int
    var samples: [Double]

    init(maxSize: Int, initialSamples samples: [Double] = []) {
        self.maxSize = maxSize
        self.samples = samples
    }

    mutating func addSample(_ newValue: Double) {
        samples.append(newValue)
        if maxSize < samples.count { samples.removeFirst() }
    }

    /// Will return `nil` when there are no samples.
    /// This allows for easy nil coalescence, without introducing the full burden of
    /// needing to unwrap in the case when the samples are known to be non-empty.
    var average: Double! {
        if self.samples.isEmpty { return nil }
        return samples.reduce(0, +) / Double(samples.count)
    }
}

var runningAverage = RunningAverage(maxSize: 5)
let mockSamples = 1...10
let runningAverages = mockSamples.map { mockSample -> Double in 
    runningAverage.addSample(Double(mockSample))
    return runningAverage.average
}
print(runningAverages) // => [1.0, 1.5, 2.0, 2.5, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0]
0 голосов
/ 22 октября 2018

Не пытайтесь принудительно развернуть то, что вы используете, чтобы развернуть:*

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...