2016-11-20 1 views
1

Я пытался получить разницу во времени двух дат из этого guide. Я не уверен, что добавить аргумент dateComponents. Когда я непосредственно передать в [.hour, .minute], я получаю сообщение об ошибке:Получение разницы во времени в Swift 3

Playground execution failed: error: MyPlayground.playground:10:46: error: type of expression is ambiguous without more context 
let timeDifference = calendar.dateComponents([.hour, .minute], from: stopTime!, to: date!) 
              ^~~~~~~~~~~~~~~~ 

`` `

Я попытался объявить его как константу первой, но не уверен, что тип. Аргумент имеет тип Set<Calendar.Component>, но я получаю сообщение об ошибке, когда я пытаюсь сказать, что это Component, DateComponent, или CalendarComponent.

`` ``

let timeFormatter = DateFormatter() 
timeFormatter.dateFormat = "hh:mm a " 
let time = "12:03 pm" 
let stopTime = timeFormatter.date(from: time) 

let date = Date() 
let calendar = Calendar.current 

let components:[DateComponent] = [.hour, .minute] 
let timeDifference = calendar.dateComponents(components, from: stopTime!, to: date!) 

ответ

5

Метод dateComponents(_:from:to:) объявлен следующим образом:

public func dateComponents(_ components: Set<Calendar.Component>, 
    from start: Date, to end: Date) -> DateComponents 

Первый параметр имеет тип Set<Calendar.Components>, но вы, кажется, обеспечивают [DateComponents]. Вот почему вы видите ошибку.

Таким образом, это должно быть сделано таким образом:

let components:[Calendar.Component] = [.hour, .minute] 
let timeDifference = calendar.dateComponents(Set<Calendar.Component>(components), 
    from: stopTime!, to: date) 

Первый, я менял тип массива, чтобы быть [Calendar.Component]. Во-вторых, я создал Set<Calendar.Component> перед тем, как передать метод components. Другое дело, что вы написали date!. ! является избыточным, поскольку date уже не является необязательным. Не нужно разворачивать!

В качестве альтернативы вы можете полностью удалить переменную components!

let timeDifference = calendar.dateComponents([.hour, .minute], 
    from: stopTime!, to: date) 

Теперь он скомпилирован в порядке!

Однако, это не может произвести ваш ожидаемый результат, поскольку timeFormatter.date(from: time) производит дату в 2000 году я получил это довольно грязное решение, но это работает так или иначе:

let timeFormatter = DateFormatter() 
timeFormatter.dateFormat = "hh:mm a" 
let time = "08:00 pm" 
var stopTime = timeFormatter.date(from: time) 

let date = Date() 
let calendar = Calendar.current 

let year = calendar.component(.year, from: date) 
let month = calendar.component(.month, from: date) 
let day = calendar.component(.day, from: date) 
let hour = calendar.component(.hour, from: stopTime!) 
let minute = calendar.component(.minute, from: stopTime!) 

stopTime = calendar.date(bySetting: .year, value: year, of: stopTime!) 
stopTime = calendar.date(bySetting: .month, value: month, of: stopTime!) 
stopTime = calendar.date(bySetting: .day, value: day, of: stopTime!) 
stopTime = calendar.date(bySetting: .hour, value: hour, of: stopTime!) 
stopTime = calendar.date(bySetting: .minute, value: minute, of: stopTime!) 

let timeDifference = calendar.dateComponents([.hour, .minute], from: stopTime!, to: date) 
+0

Вам не нужно явно создавать 'Set '. Попробуйте заменить 'Set (components)' на '[.hour, .minute]' в вашем коде. – OOPer

+0

О да! Я никогда не знал, что '[]' также может обозначать 'Set'. @OOPer – Sweeper

+0

Лучше помните, что проблема OP вызвана '!' В 'date!'. – OOPer

0

Swift 3,0

let start = Date(); 
//Your functions.. 
let end = Date(); 
print("Time to do something: \(end.timeIntervalSince(start)) seconds");