Convert NSTimInterval to Integer Swift

I need to convert a variable of type NSTimeInterval, which, as I know, is Double, Integer. I already tried the solutions here: How to convert NSTimeInterval to int? without success. Can anyone give any suggestions on how to do this in Swift? Below is my function:

func getHKQuantityData(sampleType: HKSampleType, timeUnit: NSCalendarUnit, startDate: NSDate, endDate: NSDate, completion: (Void -> Void)) -> [(NSDate, Double)] { var startTime = 0 var endTime = 0 var repeat: NSTimeInterval var returnValue: [(NSDate, Double)] = [] var queryType: String = "" var predicate: NSPredicate! let timeInterval = endDate.timeIntervalSinceDate(startDate) switch sampleType { case HKSampleType.quantityTypeForIdentifier(HKQuantityTypeIdentifierStepCount): queryType = "step" case HKSampleType.quantityTypeForIdentifier(HKQuantityTypeIdentifierHeight): queryType = "height" case HKSampleType.quantityTypeForIdentifier(HKQuantityTypeIdentifierBodyMass): queryType = "weight" case HKSampleType.quantityTypeForIdentifier(HKQuantityTypeIdentifierBodyMassIndex): queryType = "bmi" default: println("No recognized type") } switch timeInterval { // 1. Case for seconds case 0...59: predicate = HKQuery.predicateForSamplesWithStartDate(NSCalendar.currentCalendar().dateByAddingUnit(.CalendarUnitSecond, value: startTime, toDate: NSDate(), options: nil), endDate: NSCalendar.currentCalendar().dateByAddingUnit(.CalendarUnitSecond, value: startTime, toDate: NSDate(), options: nil), options: .None) repeat = timeInterval // 2. Case for minutes case 61...3599: predicate = HKQuery.predicateForSamplesWithStartDate(NSCalendar.currentCalendar().dateByAddingUnit(.CalendarUnitMinute, value: startTime, toDate: NSDate(), options: nil), endDate: NSCalendar.currentCalendar().dateByAddingUnit(.CalendarUnitMinute, value: startTime, toDate: NSDate(), options: nil), options: .None) repeat = round(timeInterval / 60) // 3. Case for Hours case 3600...86399: predicate = HKQuery.predicateForSamplesWithStartDate(NSCalendar.currentCalendar().dateByAddingUnit(.CalendarUnitHour, value: startTime, toDate: NSDate(), options: nil), endDate: NSCalendar.currentCalendar().dateByAddingUnit(.CalendarUnitHour, value: startTime, toDate: NSDate(), options: nil), options: .None) repeat = round(timeInterval / 3600) // 4. Default for Days default: predicate = HKQuery.predicateForSamplesWithStartDate(NSCalendar.currentCalendar().dateByAddingUnit(.CalendarUnitDay, value: startTime, toDate: NSDate(), options: nil), endDate: NSCalendar.currentCalendar().dateByAddingUnit(.CalendarUnitDay, value: startTime, toDate: NSDate(), options: nil), options: .None) repeat = round(timeInterval / 86400) } /* for x in 1...repeat { } */ // Returns one data point for each timeUnit between startDate and endDate // array of tuples - (date, double) return returnValue } 
+5
source share
2 answers

force:

 let i = Int(myTimeInterval) 

EDIT . The comment rightly pointed out that this approach may fail (and fail), because the Double contained in myTimeInterval may be larger than the maximum size of Int, causing an overflow.

Prior to Swift 4, dealing with this feature was quite difficult. But Swift 4 introduces two new Int initializers that solve the problem:

  • init(exactly:) is a failed initializer, so it returns an optional Int, which may be nil .

  • init(clamping:) - this always succeeds, because if it crashes due to overflow, the largest legal number will be replaced.

+11
source

You can use a double value for Int as follows: Int(exampleValue)

+3
source

All Articles