2023年10月15日日曜日

flutterについて、学んだことなど

Swiftについて学んできたため、つい比較してしまいがちです。
SwiftUIと比較して、書いてみました。

  • 似ているようで似ていない
  • flutterには、SwiftUIにおける「View」という概念が、「Widget」と呼ばれるものになる
  • SwiftUIのようにWidgetの中にWidgetを入れ子にしていく、これを「ラップ」と呼ぶようだ
  • SwiftUIにおけるモディファイアで各プロパティを指定するのではなく、Widgetの引数に含まれてゆく。そのため、SwiftUIに比べると読みづらく感じる
  • 状態を持たないStatelessWidgetと、状態を持つStatefulWidgetがある
  • このStatefulWidgetが厄介者で、扱うために状態用のクラスを作成したりと、更に読み辛く、書き辛くしている
  • そこで便利なライブラリがRiverpodとHooksである。初学者がこれを学ぶには、YoutubeでルビーDogさんの動画を見ると、すごく分かりやすいと思う。
  • flutterは主に外部のライブラリを導入して扱うことが主であり、いろいろなライブラリに関する知識が重要に感じる
  • このライブラリ導入が手間に感じるが、実は素晴らしく実装を簡単にしてくれるものがあり、使ってみると案外悪くない
  • しかしやはりネイティブの機能をフルに扱えないため、別途ネイティブでの実装が必要になる

入社から現在まで!

 さて、2023年7月にモバイルアプリエンジニアに転職いたしましたが、はや3ヶ月・・・あっという間ですね

入社から現在までの経過をざっくり記しておきたいと思います!

7月

  • 入社日は、手続きやPCセッティング
  • 翌日より、週3日出社、週2リモートでアプリ開発研修開始
  • 研修では、仕様書に基づき天気予報を表示するアプリを作成し、テストケース作成、結合テストまで実施(Swift及びSwiftUIの2パターン作成)
  • 入社前から研修させて頂いていたので、7月はほぼSwiftUIのみ
  • 先輩にレビューしてもらいつつ作成
  • 月末、案件がSwiftからflutterになりそうで、この案件にするか、別にするか確認された!しかしこれはflutterも学べると良いチャンスだ!と思い、承諾!
    頑張ります!
8月
  • 半人月(10日程度/月)で初めての案件に参画
  • SwiftUIが使用されていた
  • アプリは大部分は既にできており、不具合修正や簡単な機能追加に携わることができた
  • このアプリをflutterにするとのことで、残り半人月でflutterの学習を行った
    なお、この時点でflutterは全くの未経験でした
  • flutterでよく使われるRiverpodなどの状態管理を扱えるようになるべく、まるばつゲームアプリを作成!完成したのは9月半ばで、学び初めから約1ヶ月で作りました!
9月
  • 今月から1人月に!
  • そして出社が週1日に!
  • 初めてApple Watchアプリにも携わり、iPhone側との通信の仕組みや、ワークアウト周りについて少し学ぶことができた
  • 中旬までSwiftUIの方の機能追加や不具合修正、携わった部分のテストケース作成
  • その後、flutter版のコンポーネント作成から開始
  • 2週間ごとのスプリント(?)で1機能実装していくことに!
10月
  • 今月からフルリモートに!!
  • 1回目のスプリント終了!デザインやバックエンド側も未完成、アプリ側は仮デザインでUIのみ完了・・・?割と急がないと大変だ!
  • 2回目のスプリント開始!またも仮デザインでの実装、1回目のスプリントも継続で、デザイン変更点が多く、修正に時間が・・・。
  • API設計(大まかな叩き台?)作成を依頼され、APIについて少し学んだ!
  • バックエンドの人が副業のため、リーダーがバックエンドも兼ねる・・・かも?
と、ざっくりとした現在までの経過です!

もっと書くことあったと思うけど・・・こまめに書かないと、書ききれませんね・・・

こんな感じで、iOSエンジニアも目指す!からの、flutterを学ぶ機会を頂けたので、なんでもできるモバイルアプリエンジニア目指したいですね!

かなり間が空いてしまいましたが・・・実は・・・?

かなり間が空いてしまいましたが、みなさま、お久しぶりです。

実はなんと・・・

都内のSES(及び受託開発も行う)企業様より内定をいただきまして、2023年7月よりモバイルアプリエンジニアとして転職いたしました!

ようやく、エンジニアデビューできました!!
2022年9月の転職活動開始から、2023年3月の内定獲得まで、実に半年かかりました・・・

エンジニアデビューまでをまとめると、こんな感じです!
  1. 2015年4月、プラント設備メンテナンスの会社(建設業)に新卒入社。
    発電所設備のメンテナンスを行う部署で、作業責任者として工事を担当。
    体育会系な雰囲気や古い組織体質が合わないと感じつつも、頑張る。
  2. 2021年12月、iOSアプリを作ってみたいと思い、M1 Macbook Airを購入し、書籍とUdemyで学習開始するも、情報の古さで苦戦。
    福利厚生や給与、人間関係は特に悪く感じておらず、転職するか趣味とするか悩みつつ、ぼちぼちと学習する。
  3. 2022年5月、未経験からのエンジニア転職は30歳超えると厳しいとの現実を知り、また短期間でのスキルアップ及び転職を目指し、iOSアカデミアという、iOSアプリに特化したオンライン制プログラミングスクールに入校。
  4. 2022年9月、初めての個人アプリ(コロナ禍における行動履歴をメモするアプリ)をリリース。
    スクール卒業と共に、スクールが提携している転職エージェント頼りでの転職活動を開始。しかし、iOSアプリエンジニアとしての未経験可能な求人が限りなく少なく、エージェントからはJavaやWebなどの求人を勧められる。平日しかやり取りできないなど、やり取りに時間を要したり、希望ではない求人が多く、次第に懸念を感じ始める。
  5. 2022年12月、これではいつまで経っても転職できないと感じ、WantedryやGreenなどのIT系転職サイトを活用して、自身で仕事探しを始める。
    また現職が忙しさのピーク期を迎え、転職活動が難航する。(残業、休日出勤で、企業様の希望時間に添えず・・・)
  6. 2023年2〜3月、絶賛ピーク機の中、対応して頂いたSES企業様2社から内定を頂く。
    1社目はモバイル以外も全般的に行う企業様でエージェント経由で応募したところ。
    2社目はモバイルアプリがメインの企業様で、自身で応募したところ。
    悩んだ結果、iOSモバイルアプリに携われる可能性が高そうで、かつ面接時の雰囲気が良かった2社目の内定を承諾。
  7. 2023年4月、退職の意向を伝える。現職がピーク期であったため、引継ぎや、転職に伴う引越し等も考慮し、6月退職を希望。
  8. 2023年5月〜6月、引越し先探しや内見、片付け、引越しでバタバタした日々を過ごす。
  9. 2023年7月、転職先に入社!!!
    (長らく入社をお待たせしてしまい申し訳無かったです・・・)
    そして、実は同期入社がいるとのこと!(嬉しい!)でもコロナで初日からお休みのようでした・・・。会える日を楽しみにしてました😆
といった感じです!(長々とすみません・・・🙇)

長くなってしまったので、一旦この記事はここまでとし、また転職から今までの業務で携わったこと、学んだことなどを書いていきたいと思います!

みなさまからのコメント、お待ちしています!

2023年6月2日金曜日

NSObjectとは

  •  Objective-Cの基本的なルートクラスで、Swiftでも使用される。
  • 他のクラスが継承することで、多くのメソッドやプロパティを利用可能。
    • メモリの管理
    • オブジェクトの等価性の比較
    • クラス情報の取得
    • メソッドの動的な呼び出し
  • ObjectiveーCのプロトコルに準拠しており、相互運用性が向上する。
  • ObjectiveーC特定の機能やAPIを利用する必要がある場合に有効。

AnyObjectとは

  •  Swiftの型システムにおける、プロトコルの一つ。
  • 参照型であるクラスのインスタンスを表すための型。
    • 参照型(class):参照を介して共有
    • 値型(struct, enum):値そのものをコピーして扱う。
  • クラスのインスタンスをAnyObject型の変数やプロパティに代入できる。
  • どのクラスのインスタンスでも受け入れられる。
  • 値型には使用できない。
  • AnyObject型の変数やプロパティには任意のクラスのインスタンスを代入できるが、メソッドの呼び出しなど、クラスのインスタンス特有の操作はできない。

weak 修飾子について

プロパティにweak修飾子をつける理由
  • 循環参照(retain cycle)を避けるため
    • 循環参照とは?
      • メモリリークの一種でオブジェクト間の相互参照によって発生。
        • メモリリーク(Memory Leak)とは?
          • プログラムやアプリにおけるメモリの不適切な使用状態。
          • 不要なメモリの確保や解放漏れにより、メモリ使用量が増加し続ける状態。
      • 2つ以上のオブジェクトがお互いに強参照(strong reference)を持ち、相互に解放されなくなる状態を指す。
        • 強参照とは?
          • オブジェクトが他のオブジェクトを所有することを意味する。
          • 参照カウントが増加し、オブジェクトが解放されない限り、メモリ上に保持され続ける。
          • 強参照がデフォルト。
      • 循環参照が発生すると?
        • オブジェクトが互いに解放されなくなり、メモリの解放が行われない。
        • アプリのメモリ使用量が増加し続け、最終的にメモリリークが発生。
        • メモリリークが継続すると?
          • アプリのパフォーマンス低下やクラッシュの原因となる。
      • 循環参照は相互に強参照を持つ場合に発生する。
    • 弱参照(weak reference)とは?
      • 参照カウントを増加させず、参照先オブジェクトが解放されると、自動的にnilになり、循環参照を解消するのに役立つ。

2023年3月26日日曜日

[SwiftUI]TextFieldで文字列ではなく、数値やnilを扱いたい(挙動の違いも検討)

はじめに

 以前SwiftUI学習のために作成したアプリ(リンク)において、使用者様から、「TextFieldに金額を入力して、その金額のお皿を追加するButtonをタップした際にTextFiledの入力値をクリアできたら良いのでは」というご指摘をいただきました!(ありがとうございます!)

 そこで対応していた際に、うん?簡単そうでうまくいかないぞ?っていう点があり、調べても調べても解決できず苦労した点をここに記します!多分不具合か仕様かと思っています!

詳細わかる方いましたらコメントください!一旦個人的な見解を述べてます!


現在の開発環境

・PC:MacBook Air M1
・Xcode:Version 14.2
・Swift :Version 5.7.2

文字列ではなく、数値を入力値として扱うには?

 TextFieldで扱う値を数値だけにするには、引数textではなく、value及びformat(formatter)を用います。
 textはString型であり、そのままでは数値やnilを許容するオプショナル型を扱えません。format: .numberを指定することで数値にフォーマットすることができます。
 入力するキーボードを指定するには.keyboardType(.numberPad)モディファイアを付与します。

ここで問題が・・・

 valueとformatterを用いていたので、Buttonタップ時にvalueにバインディングしている変数に空文字列""を代入すれば解決・・・とはいきません。
変数には数値を扱うためにInt型にしています。しかし"0"を代入すると"0"が残るので、オプショナル型を用いる必要がありますね。"0"でも良いのですが、指でTextFieldをタップして数値を入力する際に、微妙に邪魔してくれるので、消しましょう。
Buttonタップ時の処理に、@Stateを付与してTextFieldにバインディングしている変数にnilを代入する処理を追記します。
ここまでは何ら問題ありません。

 ここからが問題でした。シミュレータにて、挙動を確認したら、あら不思議。
何ということでしょう・・・TextFieldの値が、消えないではありませんか。
 しかしながら、printで出力して値を確認すると、当該変数の値は変更されています。・・・であれば、Viewが更新されていない可能性があると考え、調べても調べても情報はありません。@StateはViewとリンクしている、これはSwiftUIにおける最大のメリットと考えていましたが・・・こうも裏切られるとは・・・

解決のために

 プロジェクト上では他のコードが影響あるのでは?という懸念を振り払うため、新規プロジェクトを作成し、余計なコードは書きません。
 TextFieldとButtonだけ配置し、さあ実験。結果は・・・やはり変わりません。
そこで、TextFieldをもう一つ増やし、そちらは引数textで挙動を確認しました。
すると驚くことが判明しました。
 textにバインディングしている変数の値に””を代入するパターンはしっかりViewに反映されるのです。そう、valueだけが、nilも数値も、変数に代入した値がViewに反映されていない、ということがわかりました。もちろん変数の値は変更されています。(printで確認ずみ)
 しかし、ある条件下ではvalueの方もしっかりとViewが更新されたのです。これはさまざまな実験をする中での偶然の気付きでした。

原因は・・・?

 その条件とは、value側のTextFieldに値を入力した後、text側のTextFieldを選択して、Buttonをタップすることです。要は選択(フォーカス)状態が解除されている場合のみ、TextFieldの値が変更されたのです!text側は選択(フォーカス)状態関係なくViewが更新されるのに・・・。

 詳細な原因は判明しておりませんが、仕様としてこのような挙動がある、ということがわかりました。なので、同じように沼にハマってしまった方にも情報を共有できたらと思い、記事にしました。私自身、まだモヤモヤは残りますが、一旦挙動の違いということがわかり、悩み続けることがなくなり一安心です。
 共感や解決策等ありましたら、お気軽にコメントお願い致します!

以上!

追記

 ちなみに、引数formatではなく、formatterを用いた場合、TextFieldに値を入力しても、リターンキーを押されないと、変数に値が反映されず選択(フォーカス)状態が解除された時点で入力した値が消えます。numberPadにはエンターキーがないため、強制的に解決するしかなくなります。こちらの記事にこの挙動については記載がありました。これにもかなり悩まされました・・・

 あと、流行りのchatGPTに聞いたら、オプショナル型を扱うとViewが更新されないと教えられましたが、大嘘でした笑。

2023年1月8日日曜日

Firestoreでのデータの保存について2

 昨日に引き続き、今回は、Firestoreにデータの保存(書き込み)ができるか、確認を行います。

Firestoreへの保存確認

アプリ名.swiftファイルを以下のように編集する。

import SwiftUI

import FirebaseCore

import Firebase

import FirebaseFirestore


class AppDelegate: UIResponder, UIApplicationDelegate {

    

    func application(_ application: UIApplication,

                     didFinishLaunchingWithOptions launchOptions:                   [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

        FirebaseApp.configure()

        Firestore.firestore().collection("users").document("Message").setData([

            "UserMessage": "message",

            "Date": "messageDate",

            "UserId": "messageId",

        ], merge: false) { err in

            if let err = err {

                print("Error writing document: \(err)")

            } else {

                print("Document succesfully writen!")

            }

        }

        return true

    }

}


アプリをビルドした際にデータが保存されているか、Cloud Firestoreで確認する。

usersというコレクションの中に、
Messageというドキュメント、さらにその中に、
以下のデータが格納されていることが確認できます。
  • Date"messageDate"、
  • UserId "messageId"、
  • UserMessage "message"
これで親、子、孫のように階層状にデータが保存できることがわかりました!

 


2個目の個人開発アプリ、リリースしました!

この年末年始で個人開発アプリ、2個目を無事にリリースしました!

開発環境

  • Xcode 14.2
  • SwiftUI
  • MacBook Air M1 メモリ8G

開発期間

 約6日間、合計40時間程度
 (リジェクト対応含む)

アプリコンセプト

 アプリ起動後簡単に、一定時間毎に通知するタイマーを設定できる

アプリ開発背

 つい最近、こたつを朝からつけっぱなしで外出して夕方に気がつき、妻に叱られたので「スマホのアラーム機能をわざわざ設定するのも面倒だよなぁ・・・」と思い、「じゃあアプリ起動するだけで通知できるようなアプリを作ればいいじゃん!」ってことで開発しました!
他の学習で行き詰まっており、息抜きも兼ねてです笑

想定するユーザー

 こたつやストーブを消し忘れやすい人たち(私)

実装した機能

  • UserNotificationを用いた通知機能(アプリ起動中でもバックグラウンドでも通知)
  • UserDefaulsを用いた内部データ保存機能
  • Timer.scheduledTimerを用いたカウントダウン機能
  • NavigationStackを用いた画面遷移(かなり特殊に感じました・・・)
  • 通知が許可されていない場合に表示する、アラート機能(設定画面への遷移含む)
  • GoogleAdmobを用いたインタースティシャル(全画面)広告表示機能

アプリ画像





アプリURL

 もしよかったら、ダウンロードしてみてください!

このアプリの今後について

 特にありませんが、機能改修希望や不具合ありましたら、ご連絡いただければ対応考てます!

2022年10月25日火曜日

Firestoreでのデータの保存について1

前回制作したアプリでは、Realmを用いてデータの保存処理を行なっていました。

しかし、端末内に保存されるため、アプリを削除すると、データも共に消えてしまいます。

そのため、今回はFirebaseのCloud Firestoreというものを使って、データの保存処理について実装します。そこで学習したことを簡単にまとめていきます。

概要

  • モバイル開発、ウェブ、サーバー開発に対応したデータベース
  • 階層データ構造に対応
  • リアルタイムアップデート
  • オフラインサポート(オフラインでもキャッシュから読み書き可能)

開発環境:Xcode (Ver.13.4.1)、SwiftUI

実装について(Firestore自体の設定は省略。基本的に手順通りに進める)

  1. Firebaseにアクセスし、プロジェクトを作成。
  2. iOSアプリを選択し、アプリの登録を行う。
  3. バンドルIDはXcodeにて確認できます。
    (アプリプロジェクトファイル選択 >TARGETSのプロジェクト選択
     >General >Bundle Identifier)
  4. 設定ファイルをダウンロードし、Xcodeにドラックアンドドロップで追加する。
    (Copy items if neededにチェックを入れること)
  5. Firebase SDKの追加
    CocoaPodsやSPM(Swift Package Manager)にてインストールします。
    私は、SPMにて導入しました。導入方法は以下の通りです。
     XcodeのFile>Add Packagesを選択し、右上の検索窓に、
     「https://github.com/firebase/firebase-ios-sdk.git」を入力し、必要なライブラリを導入する。
    ただしここが一番の躓きポイントでした・・・
    様々なサイトや書籍を参考にしたものの、どれを導入すべきか、明記しているものがなく、記載通りではエラーが出るなどして、かなり導入に時間を要しました。
    肝心のところを・・・覚えてません。思い出し次第追記します。
  6. 初期化コードの追加
    SwiftUIの場合の導入については、公式ドキュメントに記載がないので、他の方の記事を参考に記述しました。というか、Firebase公式ドキュメント、何事もざっくりしか書かれておらず、これだけでは初学者には実装困難です。
    AppDelegate.swiftファイルはないため、プロジェクト名.swiftに以下を追記します。
    ・import Firebase
    ・class AppDelegate内のfunc application(~)内に FirebaseApp.configure()
  7. 次にまたウェブに戻り、Cloud Firestore(Firestore Database)を選択し、ルールの設定などを行う。
     allow read, write: if true;  tureにすることで、アクセス可能になります。
  8. ここからは、データの書き込みが行われているかの確認手順ですが、続きは後日・・・?

参考書籍:つくって学ぼiOSアプリ開発

2022年10月4日火曜日

2個目のアプリ作成開始!SwiftUIにトライ!!

2個目のアプリ作成開始!今回はSwiftUIを学びながら進めていこうと思います!
10月2日:アプリ設計
10月3日:ワイヤーフレーム作成、SwiftUI学習、Home画面作成
10月4日:Home画面大まかにVIewとして完成

因みに、私はiOSアカデミア(プログラミングスクール)入校以前(半年くらい前)は、書籍でSwiftUIは軽ーく学んでました!ので、余裕余裕と思いきや・・・久しぶりに扱うと、案外難しい!
そこで、ここが違った!というところを本日はまとめていきます!

主な相違点

  1. 視覚的にViewにコンポーネントを配置する操作(StoryBoard)がない!
  2. 上記に伴いオートレイアウトの制約もない!
  3. コードを記述したら、常にプレビューに反映され、見ながらレイアウトできる!
  4. コンポーネント実装にあたり、コードが違う!
数日の学習だけで上記のような点が挙げられます!
これらに対して、StoryBoardでの実装方法を学ぶ前(スクール入校前)は、
  1. StoryBoardって難しそう・・・
  2. え、設定むっず!!
  3. SwiftUIの方が、最新だし、すぐプレビュー見れるし最高!
  4. 割と記述簡単だー
っていう認識でした!しかしStoryBoardを学んだ後にSwiftUIを復習する中で、以下のように感じました!
  1. ついついコンポーネントを直接配置したくなる!もやもや
  2. オートレイアウトないから、レイアウト難しい・・・
  3. プレビューがあるけど・・・処理が重い・・・(M1 MacBook Air 8G)
  4. 記述方法が難しい・・・
慣れによるものとは思いますが、慣れてしまえば案外StoryBoardの方がやりやすく感じるかもしれません!
因みに、スクール的には、まだ現場ではStoryBoardでの実装が多いとのことで、そちらのカリキュラムでした!

本日は時間ないので、以上!

2022年10月1日土曜日

比較して学ぶRxSwift入門 学習

 今日から書籍「比較して学ぶRxSwift入門」を元に、学習開始!学んだことを記録していきます!気になった方はぜひ書籍を手に取ってみてくださいね!

リアクティブプログラミングとは?

時間と共に変化する値と振る舞いの関係を宣言的に記述するプログラミング手法。
・・・と言われてもわかりませんよね?
こちら書籍でExcelを用いた例があり、それを見れば理解しやすいかと思います!
簡潔にいうと、A+B=Cという式があった際に、AもしくはBの値が変化した場合に、Cも変化するよ!的なプログラミングってことですね。

RxSwiftの導入について

CocoaPodsを用いる場合、以下の通りです。
  1. ターミナルにて、導入したいプロジェクトのディレクトリへ移動
  2. コマンド「pod init」を実行 > Podfileが生成される
  3. 「Podfile」を開き、「pod 'RxSwift'」「pod 'RxCocoa'」を追記し保存(バージョンは指定しない)
  4. コマンド「pod install」を実行

Observable(監視可能な?)とは?

イベントを検知するためのクラス。ストリームとも言われる。
Obsarvable:イベント発生元(.tapなど)
Obsarver:イベント処理(onNextなどの中身)

通知するイベントの種類

  • onNext:デフォルトのイベントを返す。値を格納でき、何度でも呼び出し可能
  • onError:エラーイベント。1度だけ。購読(?)破棄
  • onCompleted:完了イベント。1度だけ。購読(?)破棄

Disposeについて

購読(?)を破棄し、メモリリークを回避するためのもの。

SubjectとRelayとは?

Observableのイベント検知 + イベントの発生ができる

以下の4種類が存在
  • PublishSbject
  • BehaviorSubject
  • PublishRelay
  • BehaviorRelay
Relayに流せるイベントは、onNext のみ。(逆を言えばエラーがないことの保証となる)

Publishはバッファを持たず、Behaviorはバッファを持つ。
(subscribe時に一つ過去のイベントを受け取流ことができ、
 最初にsubscribeするときには宣言時に設定した初期値を受け取る)

 subscribeとは:購読する、約束するという意味。

使い分け

  • Subject:通信処理やDB処理など、エラー発生時に処理を分けたいとき。
  • Relay:UIに値をBindする。(onErrorやonCompletedが発生すると、購読が止まる(その先のタップや入力イベントを拾えなくなる)ため。

bindとは?

RxSwiftでは、単方向のデータバインディング。
subscribeする場合は処理を記述するが、bindすることでよりコードが簡潔になる。

Operatorとは?

Observableに対し、イベントの変換(mapなど)・絞り込み(filterなど)などの加工を施して、新たにObservableを生成する仕組み。


2022年9月29日木曜日

作成済(レイアウト済み)アプリへのScrollView追加実装について

 アプリ配信後、現在の職場の方数名にアプリをダウンロードして、使ってもらったところ、とあるおじ様のiPhone8にて、レイアウト崩れを確認。

前回のアプデにて、レイアウト改善できた。・・・はずだった。

アプデしてもらうと・・・あら不思議!画面下部の登録ボタンだけ見切れて、肝心のデータ保存ができない!!

Labelなどのフォントサイズは指定して、同機種シミュレータで見切れないことも確認したのだが・・・・なぜだ!?というわけで、ScrollView実装に踏み切りました!実装自体は簡単ですが、レイアウト完成済ということもあり、めっちゃくちゃ苦労しました!


実装における問題点

  • ScrollViewを追加配置すると、作成していたViewより前に来るので配置換えが必須。
  • 上記解消のため、コンポーネントの配置換えをすると、オートレイアウトの制約が全て解除される!(ここが一番の問題点)
以上の問題が発生。特にオートレイアウトの制約解除はキッツイ・・・今までの苦労が水の泡に・・・。ってなるので、必死に試す、調べる、試す・・・を繰り返すこと数時間?やっと損害の少ない方法にたどり着いた!(多少は手直し必要です。ですが全部より断然マシです)


解決方法!(ここに至るまでが大変だった!)

  1. ScrollView及びその上にViewを配置、各種設定。(この手順はこちらのサイト参照)
  2. レイアウトを崩さずに、ScrollViewに乗せたい(スクロールしたい)コンポーネントを全選択する。
  3. Xcodeのメニューにある、Editor>Embed in>View を選択すると、選択したコンポーネントが一つのViewコンポーネントに格納される。
  4. このViewコンポーネントを、手順1で配置したScrollView上のViewに格納
  5. そうすると、一部エラーが出て、制約の手直しが必要になるものの、大まかなレイアウトは崩れずにScrollView上に配置できる。制約の手直しも、ほぼオートで大丈夫。(自分の場合)

以上!


2022年9月27日火曜日

iOSアプリ設計パターン入門(書籍) 学習2

MVPとは?

画面の描画処理とプレゼンテーションロジックとを分離するアーキテクチャ

  • Model:純粋なドメインロジックやそのデータを持つ(MVCと同じ)
  • View:ーザー操作の受け付けと、画面表示を担当する
  • Presenter:View と Model の仲介役であり、プレゼンテーションロジックを担う

目的

保守のしやすさ向上

MVVMとは?

画面の描画処理とプレゼンテーションロジックとを分離するアーキテクチャ

ViewとViewModelを関連づける(データバインディング)ことで、ViewModelの状態変更に同期してViewの状態も更新される。

  • Model:純粋なドメインロジックやそのデータを持つ(MVCと同じ)
  • View:ーザー操作の受け付けと、画面表示を担当する
  • ViewModel:View-Model 間の画面表示のための仲介役
と、これだけ見るとほぼMVPと同じ・・・??と感じます。
データバインディングするかしないか、くらいの違いでしょうか・・・?

実装手段として、以下の手段がある
  • Nontification Center:手間もコード量も多い、非現実的、実装コスト高い
  • RxSwift(外部ライブラリ):学習コストかかる、ライブラリのアプデに追従する必要、記述が容易
以上!
詳しいことは、以下の書籍を購入して確認してくださいね!
図や、実装に関するコードとかも記述あります!
私には難しいことまではまだまだ理解できないので、かけません笑

2022年9月26日月曜日

iOSアプリ設計パターン入門(書籍) 学習1

Twitterで他のエンジニアさんからお薦めされた書籍(iOSアプリ設計パターン)を本日より学習開始!その中で大事だなと感じたところを抜粋してまとめてみようかと思います!

APIが守るべき原則とは?

  •  使い道を明確に
  • 短い名前よりも明確であることが重要 
  • ドキュメントコメントを書く
とのこと。
要は間違えないようなメソッド名、変数名にするべし、ってことだと思います!
ついつい楽して短いメソッド名付けがちですよね・・・。打ち込み面倒だし・・・。
しかし後々困るのは自分自身ですので、しっかり書きましょう!私!😂

本日は短いけど学習終わり!
以上!

2022年9月25日日曜日

RxSwiftとは??(実装については未記述)

Rx Swiftとはなんぞや?と思い、さまざまなサイトを調べ回りました。
それらをこのページにまとめていこうと思います。

Rx Swiftとは?

非同期処理やイベント処理を宣言的に記述可能なライブラリ。
Swiftの機能だけでも実装できるが、導入することで簡潔に宣言可能。
Rxとは、ReactiveXの略称。各言語に移植されている。
ReactiveXとは、元は.NET(?)用のReactiveExtensionsというフレームワークのこと。

非同期処理とは?

非同期処理とは、ある処理をしながら、別の処理を行うこと。(これは並行処理)
実行している処理を止めることなく、別の処理を実行できること。
メリット:全体の処理を速められる。
デメリット:プログラムが複雑になりやすい。

同期処理とは?

1つずつ順番に処理を行うこと。
メリット:プログラムの記述通りに処理されるため理解しやすい。
デメリット:処理完了に時間がかかる。 

で、実装については・・・?

すみません、まだまだ学習不足で全然理解できてません・・・。
理解が結構難しそうで、また実装について解説のあるサイト・書籍ともに少なそうです。
Udemyもなかった・・・(日本語に限るため)
しかしYoutubeには解説動画あるみたいなので、これからそれらを用いて学んでいこうと思います。

2022年9月23日金曜日

アーキテクチャとは?

  就活にあたり、スキルシートを作成している中で、作成したアプリの「アーキテクチャ」なるものを記述する項目があり、そもそも言葉の意味が分からない・・・。

 軽ーく調べてみると、「基本設計やシステムの構造であり、個別の実装そのものではない」とあり、尚更理解不能に・・・そこでメンターさんに聞いてみたところ、「MVCになるかと思うが、面接でも高確率で質問される事項であり、概念や具体例など、知識を得た方が良い」というアドバイスを頂けたので、調べたことをまとめてみました!ザクっと!

アーキテクチャとは?

 元は建築業界における、建築様式・工法・構造などを表す言葉。
 ITの分野では、コンピュータやソフトウェア、システム構成要素などにおける、基本設計や共通仕様、設計思想の指す。個別の仕様や実装ではなく、抽象的、基本的な構造や設計、動作原理などを表す。

代表的な用語

  • ソフトウェアアーキテクチャ ⇦ここが関係しそう?
  • エンタープライズアーキテクチャ
  • システムアーキテクチャ
  • マイクロアーキテクチャ
  • モデル駆動型アーキテクチャ

ソフトウェアアーキテクチャとは?

 プログラム構造を抽象化し、コードをシンプルに扱うための概念。

 特徴:機能コンポーネント(UIや内部ロジック)を分離・独立して扱える
 メリット:プログラム変更があった場合、他コンポーネントへの影響を抑えられる

MVC(Model -View-Controller)とは?

 ソフトウェアを、処理(Model)・表示(View)・入力伝達(Controller)の三要素に分割し、ソフトウェア内部データをユーザーが直接参照・編集する情報から分離する。
 各要素間の依存性が強く、変更に対する柔軟性が低いデメリットがある。(プログラム修正やテストに時間を要する)

 (構造)
 Model:データの処理
 View:UIへの出力、ユーザーが触れる(入力)部分
 Controller:ViewやModelの連絡・制御

 (流れ)
  ユーザー入力>View>Controller>Model処理>Controller>View出力

MVVMとは?なにが違う?

 ユーザーが入力した情報と、格納したデータをデータバインディング(VとVMの結び付け)にて自動的に処理するもの。先程のControllerがなく、VM(View Model)からModelに処理を実行させつつViewにも値を更新させる。

結論

 MVCとMVVMの処理の違いがわかり、自身のアプリはMVCなんだなぁと思った。
・・・理解不足?他にも学ぶことが沢山ありそう!

出典


2022年9月22日木曜日

制作したアプリ概要について!

 今日は開発したアプリの概要について紹介!

開発環境

  • Xcode 13.4.1
  • Swift
  • MacBook Air M1 メモリ8G

開発期間

 約2ヶ月、週20時間程度
 (1日2時間を目安)

アプリコンセプト

 日々の行動履歴を短時間で簡単に記録でき、提出時に出力ができる

アプリ開発背景

 コロナ禍になり勤務先に行動履歴を提出する必要がある方が、少しでも簡単に手早く記録できるようにしようと思ったことがきっかけ。

想定するユーザー

 日々の行動履歴提出を求められているエッセンシャルワーカー

使用した主なライブラリ

 RealmSwift

実装した機能

  • UIDatePicker,UIPicker,CollectionViewを用いた選択式の入力機能
  • RealmSwiftを,UserDefaulsを用いたデータの保存機能
  • UITableView,カスタムセルを用いたデータの表示機能
  • 保存したデータをCSVデータに変換する機能
  • UIActivityControllerを用いたCSVデータの共有機能
  • GoogleAdmobを用いたバナー広告表示機能

アプリ画像


アプリURL

 もしよかったら、ダウンロードしてみてください!

このアプリの今後について

  • レイアウトに関する不具合見直し(主にiPhoneSEなど小画面におけるレイアウト崩れ)

ブログの今後は・・・?

 このアプリについて、作成時の苦労や実装について、また広告収入やダウンロード状況など、記事にしていこうかと考え中です!ちなみに現時点のダウンロード数は20〜30ですが、アクティブユーザーは少ないです・・・。またアプリコンセプトの通り、「短時間」で記録できることを目的としているため、広告収入は0です😂
ではでは・・・



2022年9月21日水曜日

目指せ!iOSエンジニア!ブログ開始!!

ブログ投稿のきっかけ!

 業界未経験でiOSエンジニアを目指す中で、学んだことや苦労したことを皆さんと共有できたら・・・という思いから始めてみました!アプリ作成に関することから何でも記事にしていこうと思います!
 同じくiOSエンジニアを目指す方々と情報の共有や、相談などもできたら最高かと考えてます!ブログ投稿自体初めてなので、読み難い文章やブログの書き方なども統一性なかったりするかとも思いますが、まずは発信する、ということを楽しんでやっていこう!思います!

取り敢えず、私自身の現状について!

 現在は建設業界で働いており、機械のメンテナンスから工事などに従事し、8年勤めております!現職場はパソコンはあるものの、いまだに大量の紙とペン、印鑑やサイン・・・と時代に逆らった環境で、日々不満が募っております(笑)

アプリ開発、いつから学び始めた・・・?

 まず、アプリ開発をやろう!と思ったのは、2021年12月末。そこでMacBook Air(M1、メモリ8G)を購入しました!そこからMac自体初めて使用したので使い方を学び、年明けからアプリ開発のため、SwiftUIに関するUdemyの動画教材、書籍を購入し、ぼちぼち独学で学び始めました!
 しかしながら、教材自体の情報が古かったりでうまくいかないことが多く、最新の情報が分からない、何から始めればいいか分からない!という状態でした。
 そこで、プログラミングスクールをいろいろ調べ、探し回り、2022年5月からiOSアカデミアに入校しました!初めはSwiftUIが最新の言語であり、扱いやすい!と思っていたところから、スクール探すうちに、まだ現場では保守管理などを考えるとswiftのStoryboardを用いた開発を学んだ方が良い、ということを知り、そちらの学習に切り替え、学んでいきました!

プログラミングスクールで学んだことは・・・?

 独学の時はアプリ開発のためにはプログラミング言語だけを学べばよい!と思っていました!
 しかし実際には、Githubを用いたバージョン管理アプリ開発に便利なライブラリという便利な機能の導入方法実際にアプリとして仕上げていくための方法、なども学ぶことができ、非常に良い経験となりました!多分独学じゃずっと手を出すことがなかったと思います!特にGithubについては・・・鬼のように苦労した(開発中のアプリ消えた)ので、また後々記事にできたらと思います!
 あとはメンターさんがこまめに質問への回答や、アドバイスなどもしてくださり、頑張ることができました!
 そして入校から2ヶ月後に個人アプリ開発に進み、そこからさらに2ヶ月後、ついに自分自身で設計、考案したアプリをリリースすることができました!
 現在は就活に向けてのアドバイスを頂き、スキルシートの作成などを行なっております!

このブログの今後について・・・?

 どうなるか、継続できるのか、まだまだ謎です!



flutterについて、学んだことなど

Swiftについて学んできたため、つい比較してしまいがちです。 SwiftUIと比較して、書いてみました。 似ているようで似ていない flutterには、SwiftUIにおける「View」という概念が、「Widget」と呼ばれるものになる SwiftUIのようにWidgetの中に...