Как правильно обрабатывать множественные условия? - PullRequest
0 голосов
/ 26 апреля 2019

У меня есть три условия:

  1. И data.weight, и myoutput являются nil
  2. myoutput не имеет значения
  3. data.weight и myoutput оба имеют значение

    override func viewWillAppear(_ animated: Bool) {
        super .viewWillAppear(animated)
        self.navigationItem.hidesBackButton = true
    
        let myOutput = UserDefaults.standard.string(forKey: "height")
        let dateFormator = DateFormatter()
        dateFormator.dateFormat = "dd.MM.yyyy"
        let data = WeightTracker.mr_findFirst(with: NSPredicate(format: "date == %@", dateFormator.string(from: Date()))) as? WeightTracker
    
        if myOutput == nil && data?.weight == nil {
            bmiLabel.text = "--"
        } else if myOutput == nil && data?.weight != nil {
            bmiLabel.text = "--"
        } else {
            let dateFormator = DateFormatter()
            dateFormator.dateFormat = "dd.MM.yyyy"
            if let data = WeightTracker.mr_findFirst(with: NSPredicate(format: "date == %@", dateFormator.string(from: Date()))) as? WeightTracker {
                let myOutput: AnyObject? = UserDefaults.standard.object(forKey: "height") as AnyObject
                var sum = (myOutput as! NSString).doubleValue / 1000
                let total1 = sum * sum
                let total = Double(Int(data.weight!)!) / total1
                let dye = total/100.00
                bmiLabel.text = String(dye)
            }
        }
    }
    

Сумма рассчитывается только для третьего условия. Как правильно справиться с этим?

Ответы [ 2 ]

1 голос
/ 26 апреля 2019

Почему бы вам не пойти по другому пути

if myOutput != nil && data?.weight != nil {
    // Your logic here
}
else {
    bmiLabel.text = "--"
}

Или, возможно, заменить if на if-let в целом, чтобы обеспечить безопасное развертывание и избавиться от необязательной цепочки и / или принудительное развертывание

if let myOutput = myOutput, let weight = data?.weight {
    // Your logic here
}
else {
    bmiLabel.text = "--"
}

Или, если вы хотите ранний выход , тогда вы даже можете использовать guard-let

guard let myOutputUnwrapped = myOutput, let weight = data?.weight else {
    bmiLabel.text = "--"
    return 
}

    /* Your logic here */

Преимущества if-let и guard-let в том, что вы уже получаете развернутое значение для работы, поэтому вам не нужно беспокоиться о ! и ? с переменными.

1 голос
/ 26 апреля 2019
if let myOutput = UserDefaults.standard.string(forKey: "height") as? NSString , let weight = data?.weight {
    let dateFormator = DateFormatter()
    dateFormator.dateFormat = "dd.MM.yyyy"
    if let data = WeightTracker.mr_findFirst(with: NSPredicate(format: "date == %@", dateFormator.string(from: Date()))) as? WeightTracker{
        var sum = myOutput.doubleValue   / 1000
        let total1 = sum * sum
        let total = Double(Int(weight)!) / total1
        let dye = total/100.00

        bmiLabel.text = String(dye)
    }
} else {
    bmiLabel.text = "--"
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...