Iganinのブログ

日頃の開発で学んだ知見を中心に記事を書いています。

Swift

【SwiftUI】要素数の少ない場合の表示も考慮したチャットライクな画面の実装

環境 以下の環境で実施しています。 Xcode 14.0 iOS 16.0.2 要件定義 いわゆるチャットのUIにおいては、最新の要素が画面下部に追加されていき、画面の初期表示時は画面最下部を基準に表示されているという要件が主流かと思います。 また、その一方で要素数…

【iOS】PlaygroundでSwiftUIのViewを描画する

はじめに SwiftUIで簡単なView構成を試したいときにわざわざProjectを作るのもめんどくさいなという時がありました。 Playgroundを使用してViewの画面を作成し、表示や動作を確認する方法がわかりましたのでメモがてら記載します。 環境設定 以下の環境を使…

【iOS】UIViewをUIImageに変換する

はじめに UIViewをUIImageに変換するというよくあるやつです。 今だとこのやり方が良いのではないかというのが見つかったのでメモがてら記載します。 環境設定 以下の環境を使用しています。 Xcode 11.4.1 Swift 5.2 内容 いかに作成したextensionメソッドを…

【iOS】UITextViewでタップ遷移可能なバナーを表示する方法

はじめに UITextViewにHtmlの記述を反映させたいことがあります。その場合は下記のようなコードを書くことで、<a>タグでのリンクの表示などが反映可能です。 Stringのextensionメソッドとして作成しておくと便利です。 extension String { func convertToHtml()</a>…

【Swift】Swift5.1からOptionalのEnumのswitch文をより簡単にかけるようになった

はじめに Swift5.0まで OptionalのEnumのインスタンスに対してswitch文を使用する際は下記のように.some(T)と.noneで記述する必要がありました。 enum Frequency { case daily case weekly case monthly case yearly } let frequency: Frequency? = .daily s…

【Swift】StructやClassスコープからSelfでstatic memberへのアクセスが可能になった

はじめに Swiftではstructやenumおよびclass内からstaticなメンバーにアクセスする際には以下のようにClass名.staticMemberかtype(of: self).staticMemberとする方法がありました。 struct Sample { static var hoge: Int = 0 func sampleFunction() { // ク…

【Swift】Swift5.1からstructのイニシャライザの自動生成でプロパティのデフォルト値が考慮されるようになった

はじめに Swiftで使用されるstructは定義したプロパティにしたがってイニシャライザメソッドが自動生成されます。 例えば下記のようにUserを定義した場合に自動でイニシャライザが生成されます。 struct User { var id: Int var name: String } // init(id: …

【iOS】Push通知に必要なDeviceTokenの文字列取得に関して

はじめに サーバーからのPush通知を実行するためには、サーバーにDeviceTokenの文字列を保持し、そのDeviceTokenを指定してAPNs(Apple Push Notification Service)に通信を行う必要があります。DeviceTokenはregisterForRemoteNotifications()の実行によって…

【iOS】アプリクライアント側での文字入力のValidation機構について(UITextField, UITextViewなど)

はじめに サービスで使用するEmailアドレスやPasswordなどをアプリから入力する際に、アプリ側でValidationをかけることがあります。 そのような際に行う対応として直感的には以下のようにするかと思います。 extension ViewController: UITextFieldDelegate…

【iOS】チュートリアル画面などで使えるUIViewに穴をあける方法

はじめに チュートリアル画面などで、画面全体を半透明な黒いUIViewでおおい、一部分をハイライトして、なんらかの説明文言を表示するといったことがあるかと思います。 この際に、ハイライトしたい部分にUIImageなどを上から重ねるのも手としてはありますが…

【Swift/Kotlin】SwiftのswitchとKotlinのwhenの対比

はじめに 条件分岐を実装する際にif else以外に Swiftではswitch、 Kotlinではwhenを使用します。 基本的にはiOS開発を行っていますので、Kotlinのwhen文を書く際に書き方を思い出すのに少し時間がかかることがあり、 学習の意味もかねて両者の比較を行いま…

【iOS】UINavigationControllerでcompletionHandlerを伴ったpush/pop遷移ができるようにする

はじめに 画面のモーダル遷移を実現するUIViewControllerのpresent(viewControllerToPresent: UIViewController, animated: Bool, completion: (() -> Void)?) や dismiss(animated: Bool, completion: (() -> Void)?) では completionがあり画面遷移完了後…

【iOS】Place Holder(プレースホルダー)付きのUITextViewを作成する

はじめに 複数行のユーザーインプットを受け付けたいとき、UITextViewをよく使用します。 ユーザーがどのような内容を入力すれば良いかのヒントを与えるためにプレースホルダーの使用を検討することもよくあることだと思います。 ところが、UITextViewにはプ…

【iOS】単位付きのUITextFieldを作る方法とカスタムクラス

はじめに ユーザーからの情報の入力の際にTextViewと並んでUITextFieldはよく使われます。 単位付きの入力にしたい場合は、UITextFieldの範囲外にUILabelを設置する、 入力値に単位をつけ、それを特別扱いするようDelegateメソッド内で 対応するといった方法…

【iOS】SwiftGenで自動生成されるファイル内のStructやenumのアクセス修飾子をpublicにする方法

はじめに SwiftGenはR.swift同様にAssetやImage、Storyboardへのアクセスを、安全にしてくれるStructやenumなどの自動生成ツールです。 例えば、UIImageのインスタンスの生成はSwiftGenを使用すると下記のようになり、タイポによる不具合を防ぐことができま…

【iOS】RawReperesentableを使用してID間の使用ミスを避ける方法

はじめに アプリを作成しているとクラスやStructの一意性の判別のためにidを良く使用します。 例えばUserを定義した場合、その一意性を決めるためにUser.idを定義します。 多くの場合はidはStringかIntで定義するかと思います。 idが一つだけならば良いので…

【iOS】表示されているテキストをコピーできるUIを作成する簡単な方法

はじめに iOSアプリを作成していると文言の表示に通常UILabelを使用します。 ただ、そのままではラベル上の文言のコピーを行うことができず、利便性の面であまり満足できないような場合があります。 以下で文言をコピーできるUIを作成する方法を記載します。…

try! Swift Tokyo 2019 に参加しました

はじめに 3/21(木)- 3/23(土)に開催されたtry! Swift 2019に参加してきました。 try! SwiftはSwift関連の技術に関する技術カンファレンスです。 www.tryswift.co 今年はベルサール渋谷ファーストで開催されました。 3/21(木) - 3/22(金)はセッション…

SwiftにおけるArraySliceについて

はじめに SwiftではArrayに対して、その配列の部分配列を取得しようとするとArrayではなくArraySliceが返却されます。 なぜArrayでないのか、ArraySliceを使用する理由はなんなのか気になったので調べてみました。 環境設定 以下の環境を使用しています。 Xc…

IBOutletCollectionについて

はじめに InterfaceBuilderの要素をコードと紐づけるために、IBOutlet、 IBActionが使われます。 ただ、複数の共通要素に対してはIBCollectionを使用すると便利です。 自分用のメモをかねて、IBCollectionに関してまとめます。 環境設定 以下の環境を使用し…

Codableに準拠したStructでネストされたプロパティをフラットにする際のTips

はじめに Codableに準拠したStructやClassにおいて、ネストされた値をDecodeの際にフラットにしたいとします。 例えば以下のようなJSONに対して、下の階層の値であるaddress.nameを上位の階層のaddressNameとして扱いたい場合などです。 一般的にはこのよう…