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
}
}