SVGを表示する必要があって、SVGKitを入れてみて。
実装終わって、#Previewで表示をテストしていたら、唐突に落ちるケースが。
どうやらpolygonなデータなら大丈夫なんだけど、circle, rectだと落ちる。
なんで、、、?と調べた結果メモ。
結論としては、
原因はこれ。
シミュレータ実行時にsysctlbyname("hw.machine")で返ってくる値("arm64")がif文の分岐にない。
これのせいでNSAssertが発動して、落ちる。
(やめてよ・・・)
NSAssertなので、本番ビルドでは落ちたりはしない(通常のReleaseビルドでは無効化される)んで、安心!
・・・けど、そんなこと言われてもデータ次第で落ちたり、落ちなかったりは、焦る。
なんでそんなしょうもないのが残っているかというと、、、
SPMで最新版の3.0.0を指定してたのだけど、、、
3.0.0 on Feb 22, 2021
と、恐ろしく古いというか、何年リリースされてないんじゃ・・・という感じなせい。
対策としては、、、
適当なbranchを指定する
{
"identity" : "svgkit",
"kind" : "remoteSourceControl",
"location" : "https://github.com/SVGKit/SVGKit",
"state" : {
"branch" : "5977bcd0f688",
"revision" : "5977bcd0f688623e3f2dd63aceb4f606158f31da"
}
},
on Jan 30, 2024の↓のコミット以降であればどこでも良い。
リリースしてくれればいいんだけど
3.1とかがリリースされてくれればいいんだけど、、、
この辺眺めてると、当面に解消されることはなさそう。
かといって、3.xブランチを指定するのは、、、 僕は流石に嫌だなあ。
なので、commit指定でお茶を濁す。
そもそも何故polygonが大丈夫でcircle, rectだと落ちるのか
SVGKitの設計というか思想の問題。
circle, rectは大きさを(mmとかinchとかで)指定できる。
-> SVGLengthとして処理され、その過程でppiを参照しに行く
-> 定義外だとassertで落ちる
polygonは座標系なので関係ない。
-> ppiを参照しにいかない
何故かppiをデバイス単位で厳密に適用しようとしている。
・・・せいで、ppiの未定義デバイスという概念が発生し、落ちる。
(その努力は、果たして本当に必要なのか、、、?)
なお、データにmmとかinを指定してなくても、落ちる。
コードを追ってみると
3.0.0のpixelsPerInchForCurrentDeviceを眺めると、まさかの固定値をハードコーディング。。。
3.xだと定義を外出しして、幾らか綺麗になってるけど、やはりハードコーディング。。。
つまり、新機種が出る -> 誰かが買って、実機でppi測って、そのPR出して、それがmergeされるのを待ってから、ライブラリ更新を行う。
・・・までを毎年にやるのが正しいということになる。
iPhone以外もとなると、もっと高頻度でということになる。
それだと3.xブランチを追うほうがいい・・・のか?
毎年更新すべきか問題
今回の僕の使い方ではmmとかinchとかのデータが来ることはないし、仮に来たところで厳密に表示しなければならない必要もない。
ので、(僕は)定期更新する気はない。
皆さんもご自身の使い方で判断くださいね。