Swift

Swiftの文字列補間をカスタマイズする

以下の3つのProtocolを用いることで、Swiftの文字列補間(式展開, 変数展開などとも言う)をカスタマイズすることができる。 ExpressibleByStringLiteral ExpressibleByStringInterpolation StringInterpolationProtocol 文字列リテラルで任意の型を初期化す…

SwiftUI で画面下部にボタンを置く

NG 画面下部にボタンを置く場合、 bottom の Safe Area に被らないように置かないといけない。 何も考えずに置くと、下記のように Safe Area まで拡張されずに残念な感じになる。 VStack(spacing: .zero) { List(0..<100) { index in Text("\(index)") } But…

SwiftUI のボーダーボタン と clipped

四角ボタン 四角のボタンにボーダーをつける場合は .border modifier を指定すれば作れる。 Button("四角のボーダーボタン", action: {}) .frame(height: height) .padding() .background(Color.orange) .border(Color.red, width: borderWidth) 四角のボー…

The Composable Architecture(TCA)メモ

ViewStore binding public func binding<LocalState>( get: @escaping (State) -> LocalState, send localStateToViewAction: @escaping (LocalState) -> Action ) -> Binding<LocalState> https://github.com/pointfreeco/swift-composable-architecture/blob/main/Sources/Composab</localstate></localstate>…

SwiftUI の ScrollView を CustomShape で clip すると内部の View まで clip される

下記のように ScrollView に対して clippedShae(_:) で CustomShape を適用して clip すると、 ScrollView 内の View まで clip されてしまって View が途中で切れてしまう。 Rectangle 等の組み込みの Shape や、List に対してであれば問題は生じない。 Sta…

SwiftUI で透明な View に Gesture を設定する

下記のように、Color.clear のような透明のビューにジェスチャーを追加したかったけど反応しなかった。 import SwiftUI struct ExampleView: View { @State var text: String = "ケバブ" var body: some View { ZStack { Color.clear .onTapGesture { text =…

Compositional Layouts Self-Sizing のはまりどころと複雑なレイアウト例

github.com 紹介するコードは上記リポジトリにあげてあります。 はまりどころ 1. itemSize と groupSize を .estimated にする必要がある 例えば、height が可変の場合、グループの heightDimension を .estimated にして、レイアウトアイテムの heightDimen…

Compositional Layout におけるレイアウト構築のおすすめ

Compositional Layout の2列表示 Compositional Layout を使って、上記のような一方向のみスクロールできるグリッドレイアウトを構築する場合の実装方法についてのおすすめ。 基本 制約との二重管理になってしまうので可能な限り .absolute の使用は避け、 S…

DiffableDataSource で apply 後の UICollectionView の contentSize を取得する

問題 UICollectionViewDataSource を使っている場合では、 下記のように reloadData 直後には collectionView の contentSize が更新されている。 collectionView.reloadData() collectionView.layoutIfNeeded() // collectionView.contentSize が更新されて…

Appearance の設定方法

iOS 13 から Appearance の設定方法が追加されていた。 以前の方法もまだ非推奨になっておらず引き続き利用できるみたいだけど、 Legacy Customizations と表記されていて新しい設定方法が推奨されている。 新しい設定方法は standardAppearance プロパティ…

AssociatedValue の有りと無しの case を複数持つ Enum を Decode する

AssociatedValue が無い case が1つ enum Food { case hamburger(topping: String) case pizza } 上記のような Enum がありまして、これを Decodable に準拠すると extension Food: Decodable { enum CodingKeys: String, CodingKey { case hamburger case …

Swiftにおけるインポートとリンクの復習

先日行われた iOSDC 2019 に参加してきました。 岸川さんによる「Swiftにおけるインポートとリンクの仕組みを探る」を聞いてきました。 ふわっとしか理解できていなかった部分だったので発表内容を復習しようと思い、改めて資料の内容を書き出し、 Xcodeで触…

Carthage で Framework を公開する

先日 Framework を作って Carthage でインストールできるようにしたので、その手順を書いておきます。 作ったものはこちらで紹介しています。 komaji504.hateblo.jp Workspace や Project を作る ディレクトリ構成 Workspace や Project のディレクトリ構成…

グラデーションをアニメーションさせるライブラリ作った【iOS】

Facebook の iOS アプリでは、起動時にコンテンツを表示するまでの間、テキストや画像を表す灰色で塗りつぶした View を表示しています。そうすることで、この後にどういったコンテンツが表示されるのかということを伝えることができます。 加えて、ローディ…

UICollectionView の UICollectionReusableView の位置がおかしい時

class SampleListViewController: UIViewController, UICollectionViewDatasource, UICollectionDelegate { @IBOutlet weak var collectionView: UICollectionView! { didSet { collectionView.register( UINib(nibName: "FooterIndicatorView", bundle: nil…

for-case 文【Swift実践入門読書メモ】

Swift実践入門を読んでみて、気になったところのメモです。 for-case 文 第3章 3節 pp.91-92 Sequence プロトコルに準拠した型の要素のうち、パターンにマッチするものだけを列挙する繰り返し文です。 for 文にも case によるパターンマッチが行えて let num…

引数のクロージャの属性【Swift実践入門読書メモ】

Swift実践入門を読んでみて、気になったところのメモです。 引数のクロージャの属性 第4章 3節 pp.120-124 @escaping 属性 関数に引数として渡されたクロージャが、関数のスコープ外で保持される可能性があることを示す属性です。 こんな感じで使われます。 …

if-case 文 【Swift実践入門読書メモ】

Swift実践入門を読んでみて、気になったところのメモです。 if-case 文 第3章 2節 p.81 if-case を用いることで、以下のようなパターンマッチによる分岐が行えます。 if case 0...5 = 3 { print ("パターンにマッチしています") } 比較対象が式の右辺にくる…

画面遷移のアニメーションをカスタムする

UINavigationController を使った画面遷移のアニメーションのデフォルトは、横からスライドするアニメーションですが、これをカスタムすることができます。 最近、アニメーションをカスタムしたりといったようにカスタムトランジションについて学んでみたの…

UIPickerView に UILabel を表示するライブラリをつくった

タイトルの通り、 UIPickerView に UILabel を表示するライブラリを作りました。 github.com これを使うとこんな感じにコンポーネントごとに簡単にラベルを表示することができます。 なお、Carthage からインストールできます。 使い方 LabelPickerComponent…

iOS の時間表示設定を取得する

iOS の日付と時刻の設定の24時間表示が ON になっていれば24時間表示用の UILabel を、そうでなければ12時間表示用の UILabel を表示するという用に、時間表示設定によって View を切り替えたいと思ってググってみたのですが、解決策が見つからなかったので…

Swift の Date の操作

Date の操作方法が全く覚えられないので、調べたことをここにまとめていく。 日時を指定して Date 生成 Calendar(identifier: .gregorian).date(from: DateComponents(year: 2017, month: 8, day: 13)) ある Date の次の日の Date 生成 Calendar(identifier:…

UnitTest 用のデータを共通化する【Swift】

テストをする際には複数のオブジェクトの初期化をする必要があり、この作業が面倒でテストを書くのが面倒になってしまうことがあったので、どうにかできないかと思い調べてみたところ、良さそうな方法がありました。 clean-swift.com これを、自分が使いやす…

Swift化開発合宿 in 熱海♨️

先日、会社のモバイルエンジニア5名でSwift化開発合宿に行ってきました! 普段はなかなか Swift 化を進めることができないので、こういった機会を設けてガガガっと進めてしまおうということから、今回の合宿が決まりました。 この開発合宿記録を書いていき…

try! Swift 記録 2日目

try! Swift に参加してきました! www.tryswift.co ので、メモっていたことを書きます。 本当に雑なので、間違っているかもしれません。 2日目の分です。 1日目の分はこちら。 テスト可能なコードを書くということの2つの側面 なぜテスト バグを防げる テ…

try! Swift 記録 1日目

try! Swift に参加してきました! www.tryswift.co ので、メモっていたことを書きます。 本当に雑なので、間違っているかもしれません。 1日目の分です。2日目の分はこちら。 Swift開発者が知りたかったけど聞きにくい機械学習のすべて 機械学習ではデータ…

instantiateInitialViewController() が nil になる

同じことで何度もはまっている気がするのでメモ。 SampleViewController の Storyboard と Class を追加して、Storyboard から以下のようにインスタンスを作ろうとすると、nil になってしまう。 let storyboard = UIStoryboard(name: "SampleViewController"…

Swift で循環参照するケース

循環参照という言葉を最近よく耳にしていて、なんとなく相互参照の結果メモリリークしてしまうというのは分かっていたのですが、じゃあどうしたら起きてしまうのかというところがあやふやだったので調べてみました。 循環参照 インスタンスは参照カウンタと…

UIPickerView の使い方

UIPickerView とはこういうやつです。 これを使うための最低限の部分です。 UITableView 等と同様に DataSource と Delegate を設定して、表示する列数、行数、要素を各メソッドで return するといった感じです。 import UIKit class ViewController: UIView…

UIAlertController 使ってみた

UIAlertController を使うことで Alert や Action Sheet を画面に表示することができます。 Alert や Action Sheet とはこういうやつ↓です。 Alert Action Sheet 使う際の流れとしては、以下のような感じです。 Alert も Action Sheet もやることは同じなの…