見出し画像

【Console Application】ファイルとデータベース 316【学習記】

今回の概略

Swift では何も記述せずに子関数の throw を呼び出し元に押し付ける事はできず、 catch を書かないとならない😞
rethrow という語も有るけど引数に関数を取る様な高次関数の場合に使う物で手抜き再 throw を可能にする物ではないっぽい🤔
列挙をエラーとして定義できるらしく態々 NSError で列挙の文字列を入れる必要は無かったっぽい

#学習記 #Swift
#エラー処理

【Console Application】ファイルとデータベース【学習記】
仕様
https://note.com/sayka/n/nb8a67fa90a64?magazine_key=m7bb64c6a359f#br1mB

仕様
レコード
・レベル
 1-12
・難易度
 b,n,h,a,l
・曲名
・ランプ
 -,x,a,e,c,h,e,f

オプションスイッチ
-u file.csv # 更新(略値)
 ファイル名だけ指定した場合更新処理と見做す
-d file.csv # 削除
-p # csv 出力(略値)
 何も指定せずに起動した場合出力処理と見做す
-v # バージョン
-h # ヘルプ

----備忘録
public 装飾子 → open 🆕
列挙をカスタムエラーへ🆕
parseCsv の空行問題
Swift の args は OC 同様 [引数+1] 個


前回の粗筋

saveCsv を組んでてオーバーロード側の throw が怒られてて中断される😞



throw

例外は Java だと書かなければ上に伝播、 Kotlin や OCObjective-C だと書かなくてもエラーにはならない(止まる)…😑
Swift はその場で責任取らないといけないかすぐ上で捕まえないといけない…?🤔
これ上に流したくて do 書かないといけなかったら Swift の評価がまた下がるんだけど🙄イイノカ?アップル

[Swift] Swiftのエラー処理についてざっくりとまとめてみた
https://dev.classmethod.jp/articles/about-error-handling/

open func removeItem(atPath path: String) throws

……… open ????🙄

Swift 3からのアクセスコントロール
https://qiita.com/hironytic/items/6cc68ca93b428ba9194e

これまでのアクセスコントロール
public: 同じモジュール内だけでなく、別のモジュールからでもアクセスできる
internal: 同じモジュール内からのみアクセスできる
private: 同じソースファイル内からのみアクセスできる

Swift 3からのアクセスコントロール
open: 同じモジュール内だけでなく、別のモジュールからでもアクセスでき、別モジュールで継承またはオーバーライドができる(Swift 2までの public と同じ振る舞い)
public: 同じモジュール内だけでなく、別のモジュールからでもアクセスできるが、別モジュールでは継承、オーバーライドはできない
internal: 同じモジュール内からのみアクセスできる
fileprivate: 同じソースファイル内からのみアクセスできる(Swift 2までの private と同じ振る舞い)
private: 定義されたスコープ内でのみアクセスできる

………😞
細かくなったのは良いけど挙動が変わるのヤメテ🤬
Swift こんなのばっか😞
こんなの全要修正じゃん🙄

[Swift] Swiftのエラー処理についてざっくりとまとめてみた
https://dev.classmethod.jp/articles/about-error-handling/

catchしか書いていない場合、自動的にErrorオブジェクトであるerrorという非オプショナルな変数が渡されてきます。 ここでいうErrorオブジェクトとはクラスや構造体などの具象型ではなく、プロトコルによる抽象型のオブジェクトとなります。

プロトコル…そういや OC にもそういう概念有ったっけ…🤤
OC の時は for in に対応するためのプロトコルだったけど、エラーハンドリングにもプロトコルみたいのがあって特に書かなくても投げられる仕掛けが有ったりするのかな…?🤔
というか無いと「 do を全階層に書くバカみたいなコーディングが必要になる」わけなんだけど…🤬判ってる?アップル

カスタムエラーの定義
例外を投げたいときにはthrow文を使って以下のように書けばいいので簡単です。

………🤔
エラーを定義できるならこっちのが楽じゃない?🤤
Java 系は種類と説明を引数に用意された例外を new して throw してたけどエラーオブジェクトに関してだけは Swift の方が使い勝手良さそう🤔

でも今求めてる情報はそれじゃない😞
とりあえずこの記事には「更に外に投げるには?」というのは書かれてないぽ🙄

[Swift] rethrowsを少し整理してみた
https://dev.classmethod.jp/articles/swift-about-rethrows/

rethrows は「例外がスローされるかもしれない引数の関数」内で実際に例外が発生した場合、 「呼び出し元にその例外を伝えるので、関数型引数内で例外をハンドルしなくてもいいよ」というキーワードになります。

発見😑
"再throw" という語で検索したら出た🤤

未知の技術はこれみたいに検索するのに適切な語に行き着くのに凄い時間がかかる…😞

😭😭😭
余計怒られてるんだけどー!😭

記事を読み進めても良くわからないお😞

【Swift】rethrows とは何か、どのような時に指定するべきか
https://qiita.com/sdkei/items/b922dace5b72e9886274

//親関数
func myFunc(arg: () throws -> String) rethrows -> String {
                                   // ^^^^^^^^ throws を書くのと同じ場所に書く。
    try arg()
}
//子関数
func myFunc(arg: () throws -> Void) rethrows {
                 // ^^^^^^ throws を指定する。
    try arg()
}

………引数に throws 指定…?🤔
そういや1つ前の記事もこんな感じの書式になってたお🙄
でもこの記事も前の記事も arg に関数を渡しててそんな特殊な使用方法の関数じゃないんだけどってなってる😞
ひとまず rethrows と書くのは間違いないっぽい🤔

rethrowsは思ひやりです。
https://qiita.com/ysn/items/291a3206f900f8b31062

例外をthrowする関数を引数に受け取る場合にrethrowsを定義することができます。

あ、そもそも rethrow 自体が関数を引数にしてる場合の話で、そこからして話が違ってたわ🤪
つまり、資料の探し直し…😞

SwiftはどのようにJavaの検査例外を改善したか
https://qiita.com/koher/items/e4c1d88981291c35d571

非 検査例外とは大きな違いがあります。何が検査例外的なのかと言うと、 throws の付いた関数/メソッドをコールするときには catch が強制されるという点です。 catch するか throws の付いた関数/メソッドの中でコールしないとコンパイルエラーになります。 Java の 非 検査例外は catch が強制されないので大きく違います。

catch 強制…?🙄マジ?
握りつぶすなら `try!` って書かれてる😑イイノカ?

………どうやら今回の場合、オーバーロードだし上に責任を取らせたいから諦めて catch するしかないっぽい🤔

やれやれ…やっと元の移植作業へ戻れる…🙄


次回は

もっとサクサク進めたいけどファイル関係なのでどうしても時間がかかる😑
救いは String は NSString みたいな機能を持ってるっぽいってところ?🤔🚩

この記事が気に入ったらサポートをしてみませんか?