swift nil エラー解決事例

ここでエラー

if let first = results.first {
        let maxId = (first as AnyObject).value(forKeyPath: desc.name) as! Int64

コンソールで

po (first as AnyObject).value(forKeyPath: desc.name)
ですると
nil
が返却される

po first
でも
o elements

po result
では
1 elements
 - 0: 0 elemtnts

f:id:happy_teeth_ago:20191024000057p:plain

どういうこと? どうやら辞書型のインスタンスはあるけど、中身は空っぽらしい

result は辞書型 結局ここは何をしているかというと

        if let first = results.first {
//maxidをgetして Int64に型変換
        let maxId = (first as AnyObject).value(forKeyPath: desc.name) as! Int64
        print("newId = \(maxId+1)")
        return maxId + 1
    } else {
//初期値が無いなら1を返却
        return 1
    }

という処理をしている

else文が実行されていない ifの条件文で、falseが返却されていない

解決策

firstを辞書型に型変換して、そのcountが0ならそれは falseが返却されるはず つまりelseが実行される

//条件は2つ  1-results.first がtrue  2- (first as! Dictionary<String,AnyObject>).count > 0がtrue
//firstを辞書型へ型変換、その数が0なら空である。その場合は else文が実行される
if let first = results.first , (first as! Dictionary<String,AnyObject>).count > 0 {

ジェネリクスの定義方法

//<に型を複数指定する場合は `,`  で区切る
func 関数名<String,AnyObject> -> 戻り値の型{
処理
}

以上で解決 めでたし めでたし