bugfix> swift > 投稿

「2018-05-04 09:00:00 +0000」である最初のレコードの値を取得しようとしています。 「firstRecord」を出力すると、ターミナルにオプションの値が表示されます。

optional(2018-05-04 09:00:00 +0000).

それから私はそれを次のように展開しようとしました:

if dailyArray.count == 0 {
    print("no record was found")
}else{
    guard let firstRecord : String = dailyArray[0]["startTime"] as! String else {return}
    let firstRecordArray = firstRecord.components(separatedBy: " ")
    print("data exist \(firstRecordArray[0])")
}

そして今、Xcodeは、オプションのない値をアンラップしようとしているというエラーを表示しています。

どこで間違いを犯しているのでしょうか?

回答 3 件
  • こうやって

    guard !dailyArray.isEmpty, let firstRecord = dailyArray[0]["startTime"] as? String else { return }
    let firstRecordArray = firstRecord.components(separatedBy: " ")
    print("data exist \(firstRecordArray[0])")
    
    

    あなたのコードでは、強制的にタイプキャストしています

    ["startTime"] as! String
    
    

    これは、値が厳密に ひもながら 文字列にすることができると言います

  • オプションの連鎖を使用する場合は、 .first も使用できます  (オプションの nil を返します  空の配列で) [0] ではなく  (値を返し、空の配列でクラッシュします):

    guard !dailyArray.isEmpty else {
        print("no record was found")
        return
    }
    guard let firstRecord = dailyArray.first?["startTime"] as? String else {
        return
    }
    let firstRecordArray = firstRecord.components(separatedBy: " ")
    print("data exist \(firstRecordArray[0])")
    
    

  • オプションのチェーンとif let構文を使用して、変数をアンラップし、コードをより簡潔で明確にすることができます。

    // dailyArray should be declared as or typecast to [[String : String]]
    guard !dailyArray.isEmpty else {
        print("no record was found")
        exit(1) // or return if in func
    }
    if let firstRecord = dailyArray.first?["startTime"]?.components(separatedBy: " ") {
        print("data exists: \(firstRecord.first)")
    }
    else {
        print("no start time date was found")
    }
    
    

あなたの答え