どうもこんにちは!
サバ缶(@tech_begin)です。
私は新卒1年目からAndroidアプリエンジニアとして、開発案件に数年携わってきました。
突然、iOSアプリ開発に携わった際、学んだことをメモしていたので、それらをまとめました。
随時更新していく予定です!
Xcode / Swiftの基本用語
Target
ビルド実行後に得られる成果物のこと。
iOS, watchOS, OSXなどがある(ビルド時に必ず指定する)。
Xcode上では、左のエクスプローラーで、プロジェクト名をクリックすると選択できる。
ビルドとは、ソースコードや画像、音声ファイルなどを集結させ、
アプリとして利用可能な状態に「構築する」ことを指します。
Project(.xcodeproj)
iOSやwatchOSなど、複数の Target をグループ化することが可能。
Xcodeは、Projectを開き、Targetをビルドする仕組みになっている。
※「project.pbxproj」というファイルでファイルを管理している。
このファイルに記載がされていないと認識されない。
Subproject
先述のProjectの中に、他のProjectを組み込める。
単体でも、親Projectでも開くことができる。
Workspace(.xcworkspace)
複数のProjectを同じレベル(階層)でまとめることが可能。
SafeArea
iPhoneXなどのディスプレイ上部にある「切り欠き」に適した領域のこと。
この領域を考慮して開発することで、切り欠きに被らないようにできる。
storyboard(.xib)
Androidで言う、Designタブで視覚的にデザインできるモードに近い。
iOSの場合は、ファイルで管理している。
このstoryboardに定義したIDを参照して、実行ファイル(.m)でリソース操作したりもする。
注意点としては、ちょっとした修正でも大きな差分が生まれてしまうこと。
修正方法の目星がついたら、一度差分を無くして修正するとGit管理がしやすくなる。
- 差分を一度全て削除する場合は、「SourceControl → Discard…」を選択する。(プロジェクト全体 / ファイル単体のみも選択可能)
- 現在は、storyboard ではなくSwiftUI が主流になりつつある。
ViewController
アプリケーションの「データ」と「外観」をつなげるもの。
ボタンなどがタップされた時のハンドリング処理を記述する……など。
Androidでいう、Activityのような立ち位置。
AppDelegate
iOSアプリを作成した時点で生成される「AppDelegate.swift」というデフォルトファイルのこと。
アプリ全体のライフサイクルを管理するためのクラス(ファイル)。
アプリ全体のグローバル変数の管理などにも利用する。
例えば、ログイン有無のフラグ、ログイントークンの保持、GoogleAnalyticsのトラッキングIDなど。
Extension
iOS特有の開発指向のことで、既存のクラスや構造体を拡張することができる。
String型などSDKが持っている「型」は通常改変不可能だが、iOSではそれをExtension(拡張)することができる。
Javaの「継承」と似ているが、クラス名をそのまま拡張することが可能。
例えば「String型を継承して新しい機能を追加する」
みたいなイメージです。
CocoaPods
iOSアプリ開発におけるライブラリ管理ツールのこと。
UIViewの制約
AliginCenter X(Y) to | 垂直、または水平方向の中心に揃える |
Trailing Space to | 右側の間隔 |
Leading Space to | 左側の間隔 |
BottomSpace to | 下方向の間隔 |
TopSpace to | 上方向の間隔 |
Propartional Height(Width) to | パーセンテージで位置調整できる |
UIViewControllerのライフサイクル
条件コンパイル
「シンボル」を定義しておくと、ビルドする Target によって、その処理を実行するか決めることができる。
#ifdef~~~~
このシンボルが定義されているなら、通る。
#endif
#ifndef ~~~
このシンボルが定義されているなら通らない。(n=not)
#endif
Objective-C の基本構造
現在のほとんどのプロジェクトでは、Swiftですが、
たまに保守案件で Objective-C が使われているケースがあるため記載します。
- .h(ヘッダファイル)
- インターフェースを定義する。
- 存在するクラスを俯瞰することができる。
- .m(実装ファイル)
- ヘッダーファイルで定義されたインターフェースを実装して、実際に使う。
- 実装内容を見ることができる。
const(定数)で定義する値(URLなど)も、ヘッダファイル、実装ファイル両方に定義しなければならない。
実装ファイルにURLを定義しているのにエラーが出るときは、ヘッダファイルに定義されているか確認する必要がある。詳しくはこちら(Qiita)を参照。
Objective-Cの特徴
インスタンス生成時、メモリを確保する必要がある → alloc
値を保存できるようにする → init
以下の構文は同等の意味を持つ。[[testViewController alloc]init]
と [testViewController new]
文字列の比較は以下のようになる。
[text isEqualToString:@"りんご"];
Xcodeのショートカット
AndroidStudioとの使い分けに苦労しましたが、覚えておくと地味に役立ちます。
ファイル内検索
command + F
全体検索
command + Shift + F
ビルド
command + B
ファイル名検索
command + Shift + O
(カーソルがあった位置に)戻る、進む
command + Shift + ←(戻る)
command + Shift + →(進む)
解析の方法と不具合時の対処方法
Xcodeのバージョンを上げたらビルドエラーが出たときの対処方法
Targetを選択(Xcodeの左側にあるエクスプローラーで、プロジェクト名をクリック)し、Build Settingsを選択する。
後半にある「Swift Compiler – Language」の「Swift Language Version」でコンパイルするバージョンを上げる。
インストールできても、うまく起動しないときの対処方法
- メニューバー > Product > Archive
- 別Windowで開く(Archive)
- 右の「Distribute App」を選択
- AdHocにチェックする
- そのままNextボタンを押す
- Exportする場所を指定する
- 指定した場所にIPAファイルが出力される
- Window > Devices and Simulators
- 出力されたIPAファイルを”INSTALLED APPS”にドラッグ&ドロップして再インストールする
画像やボタンのハンドリング処理を探す
- 対象の画面のstoryboardを開く
- ハンドリング処理を見たい画像やボタンを選択する
- 右のサイドバーに表示される紐づいた処理名で全体検索する。
さいごに
実際の案件で学んことをメモしていたため、少し場当たり的な対処法なども含まれています。
お役に立てましたら幸いです!