【Console Application】基本文法 5【学習記】
言語仕様とかそういう手合の話🤤
Q.
Optional は消えたの?
A.
無事、値は取り出せた☺️
→ Optional は ! を付けて取り出す `a = optVal!`
→ nil が不明の場合 ?? を用いる。三項演算子の様な使い方 `a = optVal ?? "value is nil"`
→渡す場合は ? を受け側に付ける `a? = opt`
→ Optional の取り出しをループ中で行う場合は型推測を利用した一時変数を使う
// 基準コード
// JavaScript
let b = true;
let n = 0;
let s = "string";
let a = [false,1,"2"];
let h = {key0:true,key1:-1,key3:"hash"};
//
console.log(`b : ${b}\n`);
console.log(`n : ${n}\n`);
console.log(`s : ${s}\n`);
for(let i=0 ; i<a.length ; i++) // (i in a) では順番が保証されない
{
console.log(`a [${("0"+i).slice(-2)}] : ${a[i]}\n`);
}
for(let i in h)
{
console.log(`h [${i}] : ${h[i]}\n`);
}
【 Swift 編】変数を参照したり配列から取り出したり
それじゃ Optional について探ろうね🤤
print()の出力をカスタマイズする
https://qiita.com/totomo/items/619d2cbeb70b60c3f98e
一番手の記事は大夫強引な手法で無理やり Optional() を剥ぎ取ってる🙄
いや、こうじゃなくもっとこう、基本的な値だけ取り出す方法あるでしょ普通🤪
OptionalをUnwrapする3つの方法
https://qiita.com/Saayaman/items/1e2a87b9e61e419eaa73
あったあった🤤
readLineSW を作った時も型に String? と書いたけどこれが Optional 型だったわけね☺️
readLineSW の String? を書いた時点でこの ? が nil を含む可能性のある使い方の指定、というのは調べて判っていたわけなんだけど…🤔
じゃぁここから値をちゃんと取り出すには?が今回の主題になるのかな🤤
…これ、三項演算子みたいに簡単に取り出す方法無いかな?
三項演算子だと
a = optVal?optVal:""
みたいな同じ物を書く必要が出るから対策してる気がするのよね🤔
【Swift】Optional型を安全にunwrapしよう
Nil Coalescing Operator
https://qiita.com/daichiro/items/5fef496f4e97a053e53e#nil-coalescing-operator
あった🤤
?? という演算子を使うみたい。というか三項演算子の略系と書かれてる☺️
まぁなんでもかんでも nil? とする三項演算子かどうかはわからないけど Optional で値だけ剥がしたい時にはだいたいこれでいいのかなってやりかたになるっぽい🤤
記事を読む限りでは nil なら規定になる値を設定する必要があって↑の前回の画像の上の項目の fix 押して「親切」とか言ってたやつは実は「無理やり String 変換にする」か「 nil 時の既定値書いてね」のどちらかで対応するか(コマンドラインツールじゃないなら)デバグでしか print 使わない筈だからリリース用は無効にすべき、と提案していたのかなと思う🤔
いや、そんなの Swift 触りたて入門者は判んないから!🙄
やっぱ母国語表示されない開発環境はだめね🤪
ってことは nil チェック挟んでれば黙るのかな?
いいの?🤪
ではビルド👇
😫😫😫
?? の両脇に空白入れたらエラーが3つ減った🤪
変数を介したら今度こそ出なくなった🤪
最初は var だったんだけど「再代入してないし let にしときなよ」って出たので fix 押して変えてもらったのがこちら🤤
無事、 Optional() の文字列は消えましたとさ🤤
これの秘訣は for 内でスコープの狭い変数が宣言されていてそれに代入している事🤤
文献を調べていると分かるけど最近の言語の for は記述としては1塊だけど、実行回数分のコードが生成されるのだとか🤔
ここで変数の型を指定せずにぼんやりさせておくのが重要でループの個別の定義の際に代入される値でメモリを確保、次のループでも新たに値の型を見てメモリを再確保、としているのでコンパイルが通る、という事みたい🤤
JS みたいな柔軟性を求めて型不明を押し通しても構わないけど Swift では nil チェックと unwrap の手間(主に媒介用変数)が増えるので状況次第ではあるけど乱用しない方が無難なのかなと思った🤔
つまり、外部から JSON みたいのを取り込んだりする時には 型不定の連想配列 は有用だけど内部では整理して型付けが統一された状態で組まれるのが望ましいという事かな🤤
設計、ちゃんとやれよって事かも😞
次回は
Java の出番かな🤤
Java こそ型混在はできなかった筈だけど可能か調べてみようかな🤔