2017-02-23 9 views
-4

タイムスタンプを時刻に変換していましたが、timeStampToDateがこの出力を「オプション(1476775542548)」に与えていたため、クラッシュしてしまいました。swiftのオプションの文字列によるクラッシュ3.0

let timeStampToDate = (String(describing:merchant.post["timestamp"])) as String 
    let timeSt = Date(jsonDate:"/Date(\(timeStampToDate))/") 
    merchantOpenLbl.text = Date().onlyTimee(date: timeSt!) 

    init?(jsonDate: String) { 
    //  "/Date(1487058855745)/" 

    let prefix = "/Date(" 
    let suffix = ")/" 
    let scanner = Scanner(string: jsonDate) 

    // Check prefix: 
    guard scanner.scanString(prefix, into: nil) else { return nil } 

    // Read milliseconds part: 
    var milliseconds : Int64 = 0 
    guard scanner.scanInt64(&milliseconds) else { return nil } 
    // Milliseconds to seconds: 
    var timeStamp = TimeInterval(milliseconds)/1000.0 

    // Read optional timezone part: 
    var timeZoneOffset : Int = 0 
    if scanner.scanInt(&timeZoneOffset) { 
     let hours = timeZoneOffset/100 
     let minutes = timeZoneOffset % 100 
     // Adjust timestamp according to timezone: 
     timeStamp += TimeInterval(3600 * hours + 60 * minutes) 
    } 

    // Check suffix: 
    guard scanner.scanString(suffix, into: nil) else { return nil } 

    // Success! Create NSDate and return. 
    self.init(timeIntervalSince1970: timeStamp) 
} 
+1

オプションのバインディングを使用します。これは複数回回答されています。 –

+0

既に試したオプションのバインディングを使用すると動作しません。 –

答えて

2

merchant.post["timestamp"]から得られる任意の値をラップします。

if let timeStampToDate = merchant.post["timestamp"] as? String { 
    print(timeStampToDate) 
    let timeSt = Date(jsonDate:"/Date(\(timeStampToDate)))/") 
    merchantOpenLbl.text = Date().onlyTimee(date: timeSt!) 
} 

注:それはその後、作品はまだされていない場合、あなたは私たちにDate(jsonDate:)

編集の宣言を示すために必要があります:を、それが文字列でない場合は、

if let timeStampToDate = merchant.post["timestamp"] { 
    print(timeStampToDate) 
    let timeSt = Date(jsonDate:"/Date(\(timeStampToDate)))/") 
    merchantOpenLbl.text = Date().onlyTimee(date: timeSt!) 
} 
+0

私は問題が 'let timeSt = Date(jsonDate:"/Date(\(timeStampToDate))/ ")'であると思っています(OPは 'timeStampToDate'が正しく設定されていると言っていますから) –

+0

@AndreasOetjen OPの質問"しかし、私のtimeStampToDateはこの出力を" Optional(1476775542548) "としています。"つまり、timeStampToDateはオプションです。 –

+0

@NiravDもし条件が満たされない場合は、 –

0
この方法のようにしてみてください
let timeStampToDate = (String(describing:merchant.post["timestamp"])) as String 
let timeSt = Date(jsonDate:"/Date(\(timeStampToDate!))/") 
merchantOpenLbl.text = Date().onlyTimee(date: timeSt!) 

編集

if let timeStampToDate = (String(describing:merchant.post["timestamp"])) as? String { 
    let timeSt = Date(jsonDate:"/Date(\(timeStampToDate))/") 
    merchantOpenLbl.text = Date().onlyTimee(date: timeSt!) 
} 
+0

与えるエラー。非オプション型 'String'のアンラップ値を強制的に実行できません。 –

+0

2行目または3行目にエラーが表示されますか? –

+0

はい2行目にエラーが表示されます。 –

2

ガードletを使用して、オプションの値をラップすることができます。あなたのコードを以下のコードに置き換えてください。

guard let timeStampToDate = merchant.post["timestamp"] as? String else { 
    return 
} 

let timeSt = Date(jsonDate:"/Date(\(timeStampToDate))/") 
merchantOpenLbl.text = Date().onlyTimee(date: timeSt!) 
+0

エラーが発生しています。非void関数は、else returnの値を返さなければなりません。 –

+0

@RahulGupta完全な方法を示してください。 –

関連する問題