2016-09-16 9 views
0

iOSプロジェクトでXcode 8とSwift 3に更新しました。それは今私のアプリで私に問題をもたらします。私に正しい日付と時刻の要素を与える代わりに、私のラベルは "2016/09/15"ではなく "Optional(2016)/ Optional(09)/ Optional(15)"と表示されています。私は更新以来、すべてのコードを変更していない、それは以前は正しいものでした。これは私が使用しているものです:Swift - 新しいアップデートでオプションの問題が発生する

let date = Date() 
let calendar = Calendar.current 
let components = (calendar as NSCalendar).components([.month, .year, .day, .hour, .minute, .second], from: date) 
var day = components.day 
var day1 = components.day 
var year = components.year 
var month = components.month 
let hour = components.hour 
let minutes = components.minute 
let seconds = components.second 


let timeString = "\(hour):\(minutes):\(seconds)" 
var dateString = "\(year)/\(month)/\(day)" 

誰もが新しいオプション構文を知っていますか?

+0

誰も私に月の前にゼロを与える方法を知っています1-9そして日1-9? – adman

+1

'dateFormatter'を' yyyy-MM-dd'または 'HH:mm:ss'の' dateFormat'で使うと、先行ゼロでフォーマットされます。 – Rob

答えて

1

あなたはyou'reがあなたのtimeStringdateStringを作成するときに!で変数をアンラップする必要があります。

let timeString = "\(hour!):\(minutes!):\(seconds!)" 
var dateString = "\(year!)/\(month!)/\(day!)" 

print(timeString) 
print(dateString) 

は、プリントアウトします:

6:0:25 
2016/9/16 
+0

私はあなたが 'unwrap'を意味すると思う – akdsouza

2

DateComponentsのすべてのプロパティがためoptionalsになってきました例

var day: Int? { get set } 

しかし、変数componentsに指定されているすべてのプロパティを安全にラップすることができます。あなたが本当にこれらの文字列を自分で構築したい場合

let date = Date() 

let dateFormatter = DateFormatter() 
dateFormatter.dateFormat = "yyyy/MM/dd" 
let dateString = dateFormatter.string(from: date) 

let timeFormatter = DateFormatter() 
timeFormatter.dateFormat = "HH:mm:ss" 
let timeString = timeFormatter.string(from: date) 

、使用String(format:)DateFormatter

var day = components.day! 
+0

これらはいつでも安全にラップできますか?彼らがなぜオプションになったのか疑問に思います。 –

+1

@PatrickGoley - (dateComponentsの最初のパラメータが何であったかによって)値がない可能性があるためオプションです。値に値がないときはいつでも、それをオプションにする必要があります。それはおそらくアップルが「DateComponents」をそれに応じて更新した理由です。それらをオプションにしないようにすることは、貧弱な設計になります。 – Rob

+0

@PatrickGoley 'components(from:date:)'関数で指定されたすべてのコンポーネントを(常に)安全にアンラップできます。 – vadian

2

あなたはそれが先行ゼロでフォーマットしたい場合は、それを使用して、おそらく最も簡単です

let calendar = Calendar.current 
let components = calendar.dateComponents([.month, .year, .day, .hour, .minute, .second], from: date) 
let day = components.day 
let year = components.year 
let month = components.month 
let hour = components.hour 
let minutes = components.minute 
let seconds = components.second 

let timeString = String(format: "%02d:%02d:%02d", hour!, minutes!, seconds!) 
let dateString = String(format: "%04d/%02d/%02d", year!, month!, day!) 
関連する問題