ちきりんさんが「人生を変えた一冊」と評していたので、読んで見ました。
が、残念なことに私にはあまり内容に思うところはありませんでした。
学生運動の話が多くて、その時代の空気を知らないからか、はたまた私が男だからか・・・
ちきりんさんが「人生を変えた一冊」と評していたので、読んで見ました。
が、残念なことに私にはあまり内容に思うところはありませんでした。
学生運動の話が多くて、その時代の空気を知らないからか、はたまた私が男だからか・・・
配列の要素のアクセスにて、クラッシュする”[]”の代わりに、nilを返す”[safe: ]”を追加して使う方法です。
SwiftではArrayのインデックスに範囲外の値を指定するとクラッシュします。
let array = ["A", "B", "C"] let index = 3 let item = array[index] // EXC_BAD_INSTRUCTION でクラッシュ
そのため、要素にアクセスする前に、インデックスのチェックを行う方法があります。
let array = ["A", "B", "C"] let index = 3 guard array.indices.contains(index) else { // インデックスの範囲外なら、nilを返す return nil } let item = array[index] // 実行されない }
面倒なのでついついサボって省略してしまい、後でクラッシュすることがあります。
そこで、安全にアクセスできる”[safe: ]”を追加して、”[]”の代わりに使います。
これはインデックスが範囲外の場合、nilを返してくれます。
“[]”(subscript(Self.Index))はCollectionプロトコルのメソッドなので、同様にCollectionプロトコルに追加します。
extension Collection { subscript (safe index: Index) -> Element? { return indices.contains(index) ? self[index] : nil } }
“[]”の代わりに”[safe: ]”を使うと、インデックスが範囲外でもクラッシュせずにnilを返します。
let array = ["A", "B", "C"] let index = 3 let item = array[safe: index] // nilを返す
ちなみに配列の要素にnilが入っていた場合、戻り値の型は”Type??”になります。
let array = ["A", "B", "C", nil] let index = 3 let item = array[safe: index] // item : String??
itemに対する最初のunwrapでnilならインデックスが範囲外、2度目のunwrapでnilなら要素がnilです。
guard let firstUnwrappedItem = item else { return nil // インデックスが範囲外 } guard let secondUnwrappedItem = firstUnwrappedItem else { return nil // 要素がnil }
「そもそも範囲外のインデックスにアクセスするのはバグなのだから、nilを返すよりクラッシュさせてしまうべき」との意見もあるのですが、ユーザーにとってはアプリがクラッシュするのは最悪の事態なので、クラッシュするよりも動かない(nilチェックでリターンさせているとほとんどこの動きになります)方がはるかに良いと考えてます。
これは組込み系でよくある、フェイルセーフの考え方が主軸になっています。
xcode – Safe (bounds-checked) array lookup in Swift, through optional bindings? – Stack Overflow
なんちゃってMTBのタイヤの側面が裂けてしまったので、タイヤを交換しました。
交換前のタイヤはセンタースリックで、太さは2.0インチです。
リムテープも交換しました。
今まで入っていたのはよくあるゴム製のやつでしたが、これは塩化ビニールのような材質で硬いです。
新しいタイヤはセンターリッジで、太さは1.75インチです。
基本的にオンロードのみで、グラベルは走らないため、ロードよりのパターンにしました。
バルブを米式にしてみました。
バイクや車で米式に慣れているので、試しに使ってみることにしました。
これで虫ゴムの心配とはおさらばです。
走ってみたところ、以前よりだいぶ軽快に走れるようになりました。
自分のアプリをiPhone Xのシミュレーターで表示してみたのですが、AdMobの部分がセーフゾーンに収まらないですね。AdMobをバージョンアップすれば出来たりするのかな?
【追記】
と思ったら、別のアプリだとちゃんとセーフゾーンに収まっている・・・
やはりフレームワークのバージョンかなー。
どこでバージョン見れるんだろう。
【さらに追記】
原因は私のミスでした・・・
ちゃんとセーフゾーンに収まっていたアプリは、AdMobのバナーをStoryboard上で定義していて、ちゃんと下端が Bottom Layout Guide に合うように設定していました。
一方、セーフゾーンからはみ出していたアプリは、AdMobのバナーをソースコード上で定義していて、しかも Autolayout を使わずに、viewController.view.frame の下端に合うように frameを設定していました。
AdMobのバナーをStoryboard上で定義していて、下端が Bottom Layout Guide に合うように設定したところ、セーフゾーン内に収まるように表示されました。