他言語から初めてSwiftを使うとき知っておくべきこと【随時更新中】

Swift : スズキの自動車、オートバイも製造しているメーカ故N/Aで良く回りそう。。。ではなくPG言語らしくない紛らわしい名前です。Xcodeのメイン言語、C#/Javaより少しシンプルでちょっとVB6っぽい感じもします。やりたいことからコードの書き方の解説、ゼロからの解説WEB記事は多数ありますが、当方は他言語と違うとこだけ端的知りたい。それらをまとめてみました。

特別な記号や表現

変数の末尾の「 ?nullを許可するの意。非許可変数間で直接値は渡せないので要注意。逆に? 無し変数でnull判定するとエラーになってしまいます。
変数の末尾の「
nullを許可するの意。? 」の違いは理解していませんが、別の型として扱われるとのこと。
引数の前の「 _省略が可能な引数を示す。C++のようにデフォルト引数値があるのかは知らないです。
関数の「 ) 」に続く「->リターン値の型。世界標準に反しています。C# の「=>」ように特殊なのかと思いましたがそうではなかった。
nilNULL/nullの意。連想つきますがWEB検索すると他の用語が沢山でてきます。
@State簡単にいうと値が変化するクラスメンバ変数の模様。
var変数宣言。これはなぜか普通。
let 定数宣言。VB6のLetプロパティとは違う。
print()等への改行コードMAC上で “¥n” では改行コードと扱われず、「\」のキー位置ほ探して「\n」を打つ必要がある。
@Publishe値が変化するプロパティ。 Stateに加えた機能がある模様。
@discardableResultリターン値を見なくていい関数宣言
@EnvironmentOS環境機能を使う場合の宣言。scenePhase、dismiss など。
@Binding親のメンバを参照する。
@FocusState@StateのUIフォーカスあり版。
&+数値のオーバフロー時、実行時エラーを避けるための指定。
[ safe: インディクス ]配列インディクスオーバ時は、nilを返す。配列参照時のみの模様、設定時は何かあるのか不明。

Framework(?)

大きく2つあるようです。100%互換は無いようで、WEB記事を見るときはどちらで書いてあるか確認する必要があります。

SwiftUI最近のヤツらしい。標準クラス名が下のとだいぶ違うようです。
Swift Storyboardシナリオっぽいネーミングなので部分機能かと勘違いしています。

コード構造(SwiftUI)

  • まず画面クラスがStructで始まり困惑する。class と同意と考えてよい模様。
  • 行末の「 ; 」はない。
  • 画面定義と処理部が混在する構造。
  • 多重継承はできない。これは標準クラスを継承する際も同様。
  • デリゲートはc#のとは全くことなる。クラスに別の機能をエクステンションするのに用いる。クラス継承に近い感じ。
  • Namespace はあるのかよくわからない。
  • if の {} は省略できない。
  • switch defalut 無いとビルドエラーとなる。その中身もないとエラーとなる。
  • ++ は使えない。 += はOK。
  • スクリプト言語っぽいが、文字列に数値を結合するときは明示的に変換( String(数値) )が必要。
  • new は無い模様。
  • try ~catch じゃなくて、do ~catch にして、ハンドル対象のメソッドに try つける。
  • 初期化していないクラスメンバがあると、init() メソッドでエラーがでる。
  • GUI名やインスタンスは無い。GUIに@State変数を割当て、その値の変化で動作を作り出す仕組み。
  • よって変数値ドリブン的に仕組みとなっている。GUI操作がイベントハンドラ内で書けない場合がある。これに合わせこむため工夫と頭の切り替えが必要。
  • クラス仕様がコロコロ変わり下位互換性を保っくれない。ネット上のコードサンプルの5割は使えないと思っていたほうが模様。
  • 旧来自分たちで仕向け専用にGUI操作共通を作込んでいたようなレベルの内容が標準クラス化されている模様。それ故、そのクラス仕様が理解が難しい。そのため何をするにも面倒が多い。
  • cライクのfor文はない。
  • 入力禁止はむ、.disabled(true)、他言語はenable=false なので逆である。
  • Timer は、Viewを消去しても自動解放されない。他言語は自動解放されるが。知らずにほっとくとTimer動作が続いているので予期しない結果を招く。
  • Internet接続有無を知るための NWPathMonitor はシュミレータでは正常動作したが、実機では不安定だった。
  • 時刻のmsecの書式は、SSS である。Ex) HH:mm:ss.SSS
  • fileへの .synchronizeFile は適当に間引かれる模様。
  • fileを読むだけのとき、openは不要。fileのURLから直接変数に代入する。
  • auto変数の未使用はしつこく警告されるが、クラス内privateメンバの未使用までは警告されない。
  • 特定のコードの書き方をすると、フリーズしたかと思うくらいBuild時間が増える場合がある。
  • ネット上のサンプルコードでは、デリケートをよく用いている。デリケートはややこし過ぎ、可読性も落ちる。デリケートを使わずとも実装できる場合もある。
  • 外部ライブラリはメーカ公式でなくオープンソースが多い。適用するバージョンは吟味する必要がある。
  • URLセーフの公式APIはない。
  • アプリ終了を検知するには UIApplicationDelegate を使う必要あり。しかしXcodeから停止された場合はハンドルされない。
  • バックグラウンド処理への移行検出は、いろいろな方法かネットで紹介されているが、App クラスの onChange イベント でいいみたい。
  • TASK間の変数の排他制御は必要なのかよくわからない。コンパイラには怒られない。昔のVB6みたいな印象かと。
  • Androidでいう intentService に相当するものが見つからない。画面と独立したThreadの非同期サービスが作れないのかも。

以下よく出るメッセージ

message対応
Editor placefolder in source fileエラーメッセージがすぐ消えて内容が確認できない。左ペインにメッセージが出た瞬間ダブルクリックするとエラー箇所に飛べる。
Return from initializer without initializing all stored propertiesinit()内で未初期化プロパティがある。
Cannot assign value of type
Cannot assign to property: ‘self’ is immutableとりあえず対象変数に@Stateをつける。
Extra arguments at positions #11, #12 in call1画面のguiがおおすぎる。

GUI仕様

  • ボタンなど画面下に寄せたい場合、Spacerは便利だ。Xamarinには無かったような。
  • スクロールバーの幅は変更できない模様。
  • checkboxは、MAC OS のみで、iOS/iPadOS で使えない。
  • 一画面のGUI数に制限がある。20個くらいでout。
  • 上記GUIには、Tableの行列数はふくまれない。
  • TextField にmaxLength がない。changeイベントで制限しないといけないらしい。他言語では普通にサポあり。
  • TextField で半角に入力を制限するには面倒らしい。
  • TextField の同一fontに対する適切な高さが、なぜか端末毎に変わってしまう。自動高さ調整はない。rtfなどを表示する場合は、余裕のある高さが必要。
  • プログラム内から自viewを閉じる場合は、@Environment.dismiss を使用する。Hide や back はない。
  • 前viewに戻らない画面遷移を行う場合は、body の先頭で、state変数の判定を追加し、そのifスコープ内で次の画面のインスタンスをcallする。とても気持ち悪い。

IDE

総じてKB配置の制約も含め、Windows PCからクロスプラットフォームで 使う方が効率が高そう。未だ理解不足ですが以下の課題があるようです。

  • App Storeからインストールせず、xipをダウンロードすれば、複数のバージョンを1台にインストールできる。シンプルに。Visual Stduio は製品( Ex. 2022) において1つのみ。Androidは小細工すればできたとは思う。
  • Visual Studio Android Studio のように、画面を画面エディタで編集できない。Swiftエディタ側でGUI手入力する必要がある。(X-Windowが出始めの1990頃 OSF/Motif でGUIコードを書いていたころに比べればマシではあるが、、、VC++6時代MFCでも100%ではないが画面エディタで編集できた。イマドキ何故? ) 尚、Visual Studio Xamarin / .NET MAUI を使用したときも同じ(これはMAC側に合わせたせいかな?)。しかしこっちは画面定義は別ファイル。
  • GUIプロパティもSwiftエディタ側で手入力する必要がある。Visual Studio Android Studio はプロパティウインドウで、全プロパティが表示され、そこを変更することができる。Visual Studio Xamarin / .NET MAUI を使用した時は、これができるので、MAC上できないことではない。
  • まず GUIを選択するToolBox をどこから開くの分からない。画面エディタの少し離れた右上隅の小さな「」をクリックするのですがこんなの分からない。 Visual Stduioも Adnroid Stduio もメニューや明らかに分かるアイコンやメニュー項目が設置されている。あえて隠している?
  • GUIのプロパティが全てプレ表示されない。何のプロパティがあるか別で調べないといけない。
  • ポチ「.」入力時の自動メンバ表示は一応ある。メソッドのcallingシーケンスまでは出ない。
  • メソッドやプロパティのに、マウスオーバしてもヒント的なも、定数値、型などのが表示されない。
  • 標準のメソッドやプロパティのヘルプは、左クリックメニューからメソッドの説明は呼び出せるがマウスを介すため、Visual StudioF1ヘルプキーよりムダ時間食う
  • struct View名_Previews : PreviewProvider が自動生成されるが、ロジック部作成中にも常時Previews表示され邪魔である。画面設計がおわったらコメントアウトした方がよい。
  • iPhone/iPadの実機デバッグ時、プログラムの起動は端末上手動で行う必要がある。Visual Studio For MAC では IDEから起動できる。停止は何故か IDE から可能。
  • print()の出力先は、メニューview -> Debug Area -> Show Consol より開く。自動で開いたりしない。
  • デバック時の Brakepoint の挙動が不正確Visual Studio For MAC では正確なので何故。
  • デバッグ時の Brakepointするとアセンブラ行で位置づけられる。callstackは表示されるが、swiftのコード行ははっきりと分からない。大昔のVC++みたい。VS も AndroidStdio も使用言語のコード行で位置づけられる。イマドキ不便すぎる。
  • Eclipse Visual Studio と同様に、コード間違いがリアルタイムにエディタに表示されるが、5~10秒遅れる。間違いを直す度に、その遅れ時間分、待たないといけない。さらにムダ時間を食う。
  • デバッグ時、 iPad / iPhone とWi-Fiで接続可能。一度USB接続でXcodeに認識させておく必要あり。MACmini で Xcode を動作させ、リモート操作しているとき、手元に端末を置いておけるので便利。Xamarin も出来るようですが Microsoft の説明ページに飛ばされるので、読むのが面倒なので控えてしまいます。
  • デバックでBreakして再開するとき、普通に右▲を押すとアプリ再起動されてしまう。メニューにはContinueがあるが、スタートとポーズが別ならポーズボタンを用意すべき。
  • 画面ビューアがコケことが多々。表示のとても遅く負荷も高そう。グルグル状態も多い。不必要時は非表示にしておいたほうが良い。
  • クラスリファレンスがブラウザでないのはよい。昔のMSDNドキュメントみたい。
  • 日本語化されていない。分かってはいてもやはり目に入りにくい。
  • vi modeが標準装備されている。VS for MACのプラグインは日本語入力が狂うが、こちらは割と大丈夫。 vi modeは対応しているのは基本操作程度で未対応が多い
    • : w (上書き) 使えず
    • :行数(行ジャンプ) 使えず
    • (繰返し)使えず。これは大問題。
    • yw (ワードコピー)は使えたものの Word数yw (ワード数指定コピー)はできない。
    • undo( ur )がとち狂う。
    • 行末でyw (ワードコピー)すると改行コードも一緒にコピーされる。本来VIと違う。
    • 検索 / にて上下keyでヒストリができない。
  • 品質的には20年前のVisual Stdioのようだ。結構固まる。OSも固まる。Windows98のころを思い出す。
  • デバッグ時、変数値を直接代入できない。”Edit Value“とメニューはあるが無反応。デバッガのコマンドラインで、”po 変数名=値“で入力する必要がある。
  • 文字コード体系を指定できるよう一見できるが、UTF8に強制保存されてしまう。SJISはNGの模様。
  • コードを更新しても、そのコードfileがビルトされない時がある。
  • Archives公開用にビルトするときは必ずクリーンする。予期せずエラーがでる場合がある。
  • シュミレータに緯度経度移動モード “City run” があるが緯度経度は指定できない。

気付いた制限バグなど

  • i + Tab 入力したとき、””で囲った特定文字列があると、そちらにFOCUSが移動し、タブ入力ができない。
  • Xcode 14.3 (Xamarinの最終互換版) は、MAC OS 14 では「最新バージョンにしてください」と怒られる。普通は上位互換あるハズ。まだVS2010でもWIn11で動くが、、、
  • Xcode 15.1(MAUIの’24.5月時点での互換版) では、色テーマがエディタ部しか変わらない。
  • #ifでbuild外にした場合、アウトコメントにした場合、breakpointを残したままにすると、brakeされる。
  • ンドラインで、”po 変数名=値“で入力する必要がある。
  • 特定の漢字が化ける。”生成”など。全く違うコードになっているらしく、Windows VS Codeでも修復できない。
  • 日本語変換結果がキャッシュに残留して、狂ってときおり出てくる。
  • コードに不都合があるとBuildエラーとならず、途中でダンマリとなる場合がある。


中々慣れを要します… 随時更新中です。

操作性の悪い3つ MAC + Xcode + Swift を組み合わせた時の生産効率は、Android の 2.5倍といった感じです。新たにこの組合わせでiOSアプリを開発をしようとして見積中の方は要注意です。

もしもSwiftが面倒、すぐに環境を整えられない、ぜひこちらよりご相談ください。ただし不確定要素が高く、まだまだ勉強中なので急ぎでない案件にかぎります。

iOS17対応(xamarin込みで)の開発環境を安価に作る1

Appleより、「‘24.4月29日にiOS17向けに App Store にアップロードするのは、Xcode 15 を用いなければならない」 と宣言がありました。こういうことは一年前くらいに言ってほしいですね。

Xcode 15の要件は、macOS 13以降。

弊方のMAC Book 2015macOS 12 までしかUPできません。

しかしmacOS12 では、Xcode14.2 までしかUPできません。

よって新しいMACを導入する必要があります。中古で買えそうリストアップしました。この年代になると、ストレージが基板直付けになっていて容量UPできないとのことで出荷時の容量が重要です。iOSシュミレータはとても容量を食います。 現在導入済みのMAC Book 2015 は512GB なのでそれはキープしたいところです。

機種SSD容量GBOS中古価格底値課題
MAC Book Pro 2018512135万円以上
MAC Book Pro 2018256134万円程度KB部分破損、液晶部分破損品が多い。
MAC Book Air 2018128132万円後半台Buildは結構重いためCPU厳しい。
MAC mini 2018 128142万円後半台MAC Book ProよりCPU高スペック
MAC mini 2018 256143万円後半台
MAC mini 2018 512145万円以上

512MBモデルは手がだせません。 MAC Book 2015Xcode 14 + VS2019forMAC + 各iOSシュミレータ で使用率は30%くらい。近々では256GBでもよさそう。

MAC Book 2015 から画面共有すれば画面とキーボードはあるので MAC mini でもよい。 最新OSにも出来きて、Xcode 16 まで使える可能性もありそうなので、MAC mini 2018 の256GB版 を入手しました。

写真でみるとカッコ悪いですが、現物は筐体のエッジもシャープで、キレイなアルマイトが施され感動します。このエッジは金型では成型できないので削りだしでしょう。実務には何も役にたちませんが…

OSは前オーナーさんが最新にしてくれていました。

取り急ぎ以下2つをインストールします。Xcodeが最新にできるので、Visual Studio for MAC も最新にできます。

  • Xcode 15
  • Visual Studio 2022 for MAC

この時点でのストレージ容量は、、、まずはしばらくは持ちそうです。

開発中のアプリをVS2022 for MAC にて TestFlight 用でビルドしてみるとエラーが、、、プロビショニングプロファイル てが当たっていないようです。VS2022上ではプロファイルのダウンロードは行ったのですが、、、

どうもプロビショニングプロファイルは Buildマシンにも依存するようですね。MAC mini にて証明書を生成し同プロファイルを追加作成してみました。この時、VS2022 の Apple Developer の設定をみますと、マシン名が2種類(青下線部)現れています。MAC Book 側の証明書はエラー(オレンジ部)が出ています。

MAC mini 側の「状態」が「有効」になったので Build を進めます。再び同プロファイルの選択でひっかかり、プルダウンから選択可能な以下の設定ですすめます。”iOS Team Provisionning Pro…“とは何だかは分かりません。 TestFlight用IPAは生成できました。

App Store にアップロードしてみましたが、、、うげげっ

WindowsではProjectフォルダを丸コピーしても問題ないですが、Appleはそうはいかないようです。

パート2につづきます。

Googleアドセンスの初回一か月の成績

弊社が当ブログを題材にして、Google アドセンス にトライした最初の一か月成果です。得られた技術をいかにもれなく換金するかがテーマとして始めました。

なるほど。広告クリック率は相当低いのですね。小生自身もめったにクリックしませんが、、、

なお「9999クリックに達しました」とGoogoleより自動メールがとどきますが、あちらはGoogle検索からのクリックされた回数のようです。それを見て「こりゃすごい」と思っていましたがそんな甘くにないですね。より良い情報発信ができるように精進いたします。

Xperia Z3 tablet Compact LTE版をAndroid11相当にSetupする4【’23.9月編】

前記事

Z3 Tablet Compact LinageOS18,1 にてAndroid11相当 に update できまましたが何点か問題がありました。同端末はLinageOS以外のAndroid派生OSが色々とあります。そちらを試してみました。


OS名 : e-OS File : e-1.13-r-20230725-CUSTOM-z3tc.zip

e-OSは、iOS風のAndroidのようです。iOS でのアイコンを長押しでブルブル状態などが再現されています。こちらもAndroid11相当。なるほど、iOS慣れしている方には二粒おいしいですね。こちらでは、LinageOS18.1では動作しなかった GPS が動作しました。

e-OS をインストールすると、リカバリも e-OS 用になります。特別専用的な機能は無いようですが。

e-OSの評価結果は以下のとおりです。

  • LinageOSと同様にラジオの周波数が87より下に行かない。
  • FMラジオは強制停止しないと終了しない。
  • open gapp がインストールできない。Google play もインストールできない。
  • open gapp の Google Play かわりに App Lounge というものプレインストールされ、そこから掲載されているアプリはインストールできる。上右図。課金機能はなくfreeアプリのみ。

OS名 : iodèOS File : iode-2.14-20230829-z3tc.zip

iodèOSはボリシーはよくわかりませんが、なんかキレイ目な感じです。 OS名に、eに上カンマ 文字の使用されているところからわかるようにフランス製とのこと。 LinageOSの派生、Android11相当。

iodèOS の評価結果は以下のとおりです。

  • Google Play が、当OS用ストアからアクセスできる模様。(下図)
  • Google Play で購入したライセンスは弾かれてしまう。(下下図)
  • e-OSとはポリシーは異なり、操作方法はノーマルAndroid準拠。
  • Magic earthで地図確認できる。
  • LinageOSと同様にラジオの周波数が87より下に行かない。


以上のように他OSではGPSは動作するもののGoogle Playとの連携がうまくないです。他OSはLinageOSより少しリリース日が新しい。 Android File Host以外でLinageOSの最新をさがすと、lineage-18.1-20220710-4microg-UNOFFICIAL-z3tc.zip が見つかりました。こちらは GPS を認識しました。しかし他の端末に比べ応答速度が遅いようです。CPU能力の問題でしょうか?

これでGPSは有効化できました。後はFMラジオの周波数バンド範囲です。パート5に続きます

NP掛け払いに登録してみた

とあるサービス事業者さんよりご請求が直接でなく「NP掛け払い」なるサービスさん経由で来ています。個人向け、法人向け問わず収入代行は増えているようです。「取り立て」も代行に含むらしいのでその手間暇と、直接口座番号をさらしたくない事情があるのかもしれません。(これはこれとして相手が信頼しにくくなってしまう気がします)

代行屋さんのWEBページを拝見しても、実体が良く分かりません。取引先からも具体的な手順の説明はなかった気がします。少し解説してみます。


タイトル「NP掛け払い***請求先名」でメールが飛んできます。表題が長いので先頭だけしか見えないと、振込サギかと思い削除してしまいそうです。請求書のURLが添付されてます。pdf直リンクでログイン等は不要です。パスワードなし。URLが漏洩すると誰でも読めてしまいますね。(代わりに誰か払ってくれたらラッキーですが)

金額、振込先(代行者の口座)、代行者名、請求元、のほか「紐づけキー」なる項目が記載されています。カード決済用のURLでも生成してくるてるのかと思いきや、結局口座振込のみです。「紐づけキー」の上に「マイページ」なるキーワードが記載されています。

請求書に「マイページ」に記載されたURLへ飛ぶと、

メアド入力を求められ、

メアドから支払い元の登録ページのメールが届く、

支払い元の登録をします。

登録が済むと「紐づけキー」が入力でき、未払い案件 と 過去の支払済み案件 がリストされます。なるほど、払いが受付けられたかが確認できるようになるわけですね。

未払い案件を表示すると「振込先口座」とともに「口座振替」ボタンが現れます。

口座振替」の場合、振込手数料は掛からなくなるようです。自動的に27日に引落しされるとのこと。売上入金が月末だとするとちょっと都合悪いです。いきなり引落しはリスクを感じます。郵送による申請と審査もあり、すぐに利用できないようです。

総じて、単に支払いだけなら「マイページ」登録き必要なさそうです。

カード決済( 弊方はデビットしかありませんが ) ができるといアピールがあったので手続きを進めてみました。弊方が利用しているGMOあおぞら法人口座ではデビット決済するとキャッシュバックがあります。

マイページ」とは別で申請が必要でした。メアド入力を求められ、メアドから支払い元の登録ページのメールが届き、登録ページを開きます。利用規約の承諾が求められ、ここで「サービス手数料」なる説明が初めて現れます。具体的に額は記載がなく「会員ページに記載されている手数料」とだけあります。他「代行するための振込手数料も必要」との記載もあり。特にお得になることはなさそうです。

カード決済にすると支払いが60日先になるとのこと。そこまでは必要ないのですが、何かの保険としては蟻かもしれません。手続きを進めると最後に「審査開始」ボタンまで行き着きまます。そこで弊方はやはり申請は控えておきました。

結局、支払いは素直に振込としました。GMOあおぞら法人口座でからの他と変わらず手数料は145円。振込時に請求書番号を、フリコミ者名欄に追記しろとかの要請はなかったようです。案件と振込の結び付けがちょっと心配ですね。


以上、支払い側にはあまりメリットはなさそうです。