2016-11-20 6 views
1

私はこの2つの日付の時差をguideから取得しようとしていました。私はdateComponents引数のために何を入れるべきか分からない。 スウィフト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!) 
              ^~~~~~~~~~~~~~~~ 
は私が一定の第1としてそれを宣言しようとしましたが、種類が何であるかわからない午前:私は直接 [.hour, .minute]に渡すと、私はエラーを取得します。引数はタイプ Set<Calendar.Component>ですが、それが ComponentDateComponent、または 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]になるように、アレイのタイプを変更:

したがって、この方法を実行する必要があります。次に、componentsをメソッドに渡す前にSet<Calendar.Component>を作成しました。もう一つは、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

スウィフト3.0

let start = Date(); 
//Your functions.. 
let end = Date(); 
print("Time to do something: \(end.timeIntervalSince(start)) seconds"); 
関連する問題