Swift : スズキの自動車、オートバイも製造しているメーカ故N/Aで良く回りそう。。。ではなくPG言語らしくない紛らわしい名前です。Xcodeのメイン言語、C#/Javaより少しシンプルでちょっとVB6っぽい感じもします。やりたいことからコードの書き方の解説、ゼロからの解説WEB記事は多数ありますが、当方は他言語と違うとこだけ端的知りたい。それらをまとめてみました。
特別な記号や表現
変数の末尾の「 ? 」 | nullを許可するの意。非許可変数間で直接値は渡せないので要注意。逆に? 無し変数でnull判定するとエラーになってしまいます。 |
変数の末尾の「 ! 」 | nullを許可するの意。「 ? 」の違いは理解していませんが、別の型として扱われるとのこと。 |
引数の前の「 _ 」 | 省略が可能な引数を示す。C++のようにデフォルト引数値があるのかは知らないです。 |
関数の「 ) 」に続く「->」 | リターン値の型。世界標準に反しています。C# の「=>」ように特殊なのかと思いましたがそうではなかった。 |
nil | NULL/nullの意。連想つきますがWEB検索すると他の用語が沢山でてきます。 |
@State | 簡単にいうと値が変化するクラスメンバ変数の模様。 |
var | 変数宣言。これはなぜか普通。 |
let | 定数宣言。VB6のLetプロパティとは違う。 |
print()等への改行コード | MAC上で “¥n” では改行コードと扱われず、「\」のキー位置ほ探して「\n」を打つ必要がある。 |
@Publishe | 値が変化するプロパティ。 Stateに加えた機能がある模様。 |
@discardableResult | リターン値を見なくていい関数宣言 |
@Environment | OS環境機能を使う場合の宣言。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 properties | init()内で未初期化プロパティがある。 |
Cannot assign value of type | |
Cannot assign to property: ‘self’ is immutable | とりあえず対象変数に@Stateをつける。 |
Extra arguments at positions #11, #12 in call | 1画面の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 Studio のF1ヘルプキーよりムダ時間食う。
- 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( u と r )がとち狂う。
- 行末で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が面倒、すぐに環境を整えられない、ぜひこちらよりご相談ください。ただし不確定要素が高く、まだまだ勉強中なので急ぎでない案件にかぎります。