func setValue()

in iOS/MyStudies/MyStudies/Views/Steps/ActivityStep/ActivityStepResultModel/ActivityStepResult.swift [716:942]


  func setValue(questionstepResult: ORKQuestionResult) {
    switch questionstepResult.questionType.rawValue {

    case ORKQuestionType.scale.rawValue:
      // scale and continuos scale

      if let stepTypeResult = questionstepResult as? ORKScaleQuestionResult {

        if Utilities.isValidValue(someObject: stepTypeResult.scaleAnswer as AnyObject?) {

          if self.step != nil && (self.step as? ActivityQuestionStep) != nil
            && ((self.step as? ActivityQuestionStep)?.resultType as? String)! == "continuousScale"
          {
            let formatDict: [String: Any]

            formatDict = ((self.step as? ActivityQuestionStep)?.formatDict)!
            let maxFractionDigit = formatDict[
              kStepQuestionContinuosScaleMaxFractionDigits
            ]

            if (maxFractionDigit as? Int)! == 0 {
              self.value = round((stepTypeResult.scaleAnswer as? Double)!)

            } else if (maxFractionDigit as? Int)! == 1 {
              let v = (stepTypeResult.scaleAnswer as? Double)!
              self.value = Double(round(10 * v) / 10)

            } else if (maxFractionDigit as? Int)! == 2 {
              let v = (stepTypeResult.scaleAnswer as? Double)!
              self.value = Double(round(100 * v) / 100)

            } else if (maxFractionDigit as? Int)! == 3 {
              let v = (stepTypeResult.scaleAnswer as? Double)!
              self.value = Double(round(1000 * v) / 1000)

            } else if (maxFractionDigit as? Int)! == 4 {
              let v = (stepTypeResult.scaleAnswer as? Double)!
              self.value = Double(round(10000 * v) / 10000)

            } else {
              self.value = stepTypeResult.scaleAnswer as? Double
            }
          } else {
            self.value = stepTypeResult.scaleAnswer as? Double
          }
        } else {
          self.skipped = true  // Result is not avaiable because the Step was skippable and skipped.
        }
      } else if let stepTypeResult = questionstepResult as? ORKChoiceQuestionResult {
        if let choices = stepTypeResult.choiceAnswers,
          choices.count > 0
        {
          self.value = stepTypeResult.choiceAnswers?.first
        } else {
          self.skipped = true  // Choice count should be greater than 0 unless user skipped the Step.
        }
      }

    case ORKQuestionType.singleChoice.rawValue:

      let stepTypeResult = (questionstepResult as? ORKChoiceQuestionResult)!
      var resultType: String? = (self.step?.resultType as? String)!

      // for form we have to assign the step type of each form item
      if resultType == "grouped" {
        resultType = self.subTypeForForm
      }

      if Utilities.isValidObject(someObject: stepTypeResult.choiceAnswers as AnyObject?) {
        if (stepTypeResult.choiceAnswers?.count)! > 0 {

          if resultType == QuestionStepType.imageChoice.rawValue
            || resultType
              == QuestionStepType
              .valuePicker.rawValue
          {

            // for image choice and valuepicker

            let resultValue: String! = "\(stepTypeResult.choiceAnswers!.first!)"

            self.value = (resultValue == nil ? "" : resultValue)

          } else {
            // for text choice
            var resultValue: [Any] = []
            let selectedValue = stepTypeResult.choiceAnswers?.first

            if let stringValue = selectedValue as? String {
              resultValue.append(stringValue)
            } else if let otherDict = selectedValue as? [String: Any] {
              resultValue.append(otherDict)
            } else {
              resultValue.append(selectedValue as Any)
            }

            self.value = resultValue
          }

        } else {
          if resultType == QuestionStepType.imageChoice.rawValue
            || resultType
              == QuestionStepType
              .valuePicker.rawValue
          {
            self.value = ""

          } else {
            self.skipped = true
          }
        }
      } else {
        if resultType == QuestionStepType.imageChoice.rawValue
          || resultType
            == QuestionStepType
            .valuePicker.rawValue
        {
          self.value = ""

        } else {
          self.skipped = true
        }
      }
    case ORKQuestionType.multipleChoice.rawValue:
      // textchoice + imageChoice
      let stepTypeResult = questionstepResult as? ORKChoiceQuestionResult
      if let answers = stepTypeResult?.choiceAnswers {
        var resultArray: [Any] = []
        for value in answers {
          if let stringValue = value as? String {
            resultArray.append(stringValue)
          } else if let otherDict = value as? [String: Any] {
            resultArray.append(otherDict)
          } else {
            resultArray.append(value)
          }
        }
        self.value = resultArray
      } else {
        self.skipped = true
      }

    case ORKQuestionType.boolean.rawValue:
      let stepTypeResult = questionstepResult as? ORKBooleanQuestionResult
      if let answer = stepTypeResult?.booleanAnswer {
        self.value = answer == 1 ? true : false
      } else {
        self.skipped = true
      }

    case ORKQuestionType.integer.rawValue, ORKQuestionType.decimal.rawValue:
      // numeric type
      let stepTypeResult = questionstepResult as? ORKNumericQuestionResult
      if let answer = stepTypeResult?.numericAnswer {
        self.value = Double(truncating: answer)
      } else {
        self.skipped = true
      }

    case ORKQuestionType.timeOfDay.rawValue:
      let stepTypeResult = questionstepResult as? ORKTimeOfDayQuestionResult

      if let dateComponent = stepTypeResult?.dateComponentsAnswer {

        let hour: Int = dateComponent.hour ?? 0
        let minute: Int = dateComponent.minute ?? 0
        let seconds: Int = dateComponent.second ?? 0

        self.value =
          ((hour < 10 ? ("0" + "\(hour)") : "\(hour)") + ":" + (minute < 10 ? ("0" + "\(minute)") : "\(minute)")
            + ":" + (seconds < 10 ? ("0" + "\(seconds)") : "\(seconds)"))
      } else {
        self.skipped = true
      }

    case ORKQuestionType.date.rawValue, ORKQuestionType.dateAndTime.rawValue:
      let stepTypeResult = questionstepResult as? ORKDateQuestionResult
      if let dateString = stepTypeResult?.dateAnswer,
        let date = Utilities.getStringFromDate(date: dateString)
      {
        self.value = date
      } else {
        self.skipped = true
        self.value = nil
      }

    case ORKQuestionType.text.rawValue:
      // text + email
      let stepTypeResult = questionstepResult as? ORKTextQuestionResult
      if let value = stepTypeResult?.answer as? String {
        self.value = value
      } else {
        self.skipped = true
      }

    case ORKQuestionType.timeInterval.rawValue:
      let stepTypeResult = questionstepResult as? ORKTimeIntervalQuestionResult
      if let intervalAnswer = stepTypeResult?.intervalAnswer {
        self.value = Double(truncating: intervalAnswer) / 3600
      } else {
        self.skipped = true
      }

    case ORKQuestionType.height.rawValue:
      let stepTypeResult = questionstepResult as? ORKNumericQuestionResult
      if let answer = stepTypeResult?.numericAnswer {
        self.value = Double(truncating: answer)
      } else {
        self.skipped = true
      }

    case ORKQuestionType.location.rawValue:
      let stepTypeResult = questionstepResult as? ORKLocationQuestionResult
      if let locationAnswer = stepTypeResult?.locationAnswer {
        if CLLocationCoordinate2DIsValid(locationAnswer.coordinate) {
          let lat = locationAnswer.coordinate.latitude
          let long = locationAnswer.coordinate.longitude
          self.value = "\(lat)" + "," + "\(long)"
        } else {
          self.value = "0.0,0.0"
        }
      } else {
        self.skipped = true
      }
    default: break
    }
  }