iOSエンジニアのつぶやき

毎朝8:30に iOS 関連の技術について1つぶやいています。まれに釣りについてつぶやく可能性があります。

Swift

【Swift】ArraySlice to Array

ArraySliceのArray変換を知らんかったのでメモ👷‍♀️ 結論 Array(arraySlice)で普通にいけるらしい。 let arraySlice = items[0..<3] let array = Array(arraySlice) てな感じで短いですが、本日も以上となります🍺 その他の記事 yamatooo.blog yamatooo.blog yam…

【Swift】Arrayから特定の範囲を取り出す際に index out of range を回避する

# 結論 subscriptを使ってArrayに下記のようなextensionをはやしておくと便利です。戻り値がArraySlice<Element>?になることで、範囲外を取り出そうとした場合でもnil回避ができます。 extension Array { subscript(safe range: Range<Index>) -> ArraySlice<Element>? { if range.end</element></index></element>…

【Swift】配列から特定の範囲を取り出す技

本日はSwiftの初学者向けに、配列の特定の範囲を取得する方法を紹介したいと思います🏃‍♂️ やっていく rangeによる取得 let hoge = array[0..<2] // 配列の一番目と二番目の要素を取得 prefix / suffix による取得 let hoge1 = array.prefix(2) // 先頭から二…

【Swift】Protocolでdefault valueのあるパラメータを設定したい

本日もSwiftに関する小ネタです‍♂️ 関数でパラメータの設定を任意にする場合、下記のようにデフォルト値を設定することはよくあると思いますが、SwiftのProtocolはデフォルト値をパラメータに設定することはできません。 class Fish { func printFishName(na…

【Swift】手動でHashableに準拠させる

UIEdgeInsetsをHashableに準拠させる実装を手動で行なった時のメモ。 手動でhashvalueを取得 手動でhashvalueを取得したい場合、SwiftではHasher構造体を使用できます。combine()メソッドでデータをキャプチャし、finalize()メソッドでhashvalueを生成します…

【Swift】@testableには何の意味がある?

本日もSwift初学者向けの小ネタになります‍♂️ @testable import は何をやっている? @testable importはインポートしたモジュールのinternalアクセスレベル以下の関数にアクセスできるようにする機能です。通常は、別モジュールからinternalレベルの関数など…

【Swift】戻り値を使わない場合にコンパイラの警告を無視する

本日もSwiftに関する小ネタです‍♂️ 結論 @discardableResultアノテーションを関数につけることで、コンパイラの警告を無視することができます。 before: func hoge() -> String { print("hoge") return "" } hoge() // Result of call to 'hoge()' is unused…

【Swift】クラス名を取得

本日もSwiftの小ネタになります‍♂️ 結論 NSObjectに下記のようなextensionを生やしておくと便利です。 extension NSObject { static var className: String { return NSStringFromClass(self).components(separatedBy: ".").last! } } てな感じで本日は以上…

【Swift】Arrayで値を安全に取り出そう

Arrayから配列を取り出そうとする時に、配列外のインデックスを指定してしまうと、Index out of rangeエラーが発生してしまいます。 今回は、そんな状況を回避するための初心者向けの小ネタです‍♂️ 結論 下記のようにextensionを生やしておくことで、配列か…

【Swift】数値の0埋め

本日も初心者向けのSwiftの超小ネタです‍♂️ 数値を0埋めする Stringのformatで下記のように0埋めすることができます。ちなみに0埋めする桁数は%03dのdの前の数値をいじることで、変更できます。 let number = 3 let numberString = String(format: "%03d", n…

【Swift】UICollectionViewDiffableDataSourceでの同一値

UICollectionViewDiffableDataSourceを使ってみたところ、アイテムを表示する際の挙動が予想と違ったので軽くメモ 何が違ったのか? 複数のセクションで、値が同じアイテムを使うと、一方のセクションではそのアイテムが表示されなくなる。 例えば、セクショ…

NSCollectionLayoutDimensionの種類

iOSのCompositionalLayoutを使うにあたり、サイズを指定するためのNSCollectionLayoutDimensionの種類を調べたので軽くまとめておきます‍♀️ NSCollectionLayoutDimensionの種類 NSCollectionLayoutDimensionの種類は下記になります。 // dimension is comput…

【Swift】特定の文字列の置き換え

今回は下記のようなsemantic versioningのバージョンを 2.34.0 下記のような数値で取り出した際のメモです。(用は文字列操作) 2340 結論 StringProtocolのreplacingOccurrencesメソッドを使うことで、特定の文字列をリプレースできます。 let versionString …

【Swift】StackViewの乗ったXib(UIView)でSelf-Sizingしたい

結論 そのまま、取得したViewのsystemLayoutSizeFittingで、StackViewのAutoLayoutが反映されると思ったら、そんなことはなかった。 let v = CustomeView.instantiate() v.frame = .init(x: 0, y: 0, width: UIScreen.main.bounds.width, height: v.systemLa…

【iOS】ScrollViewのトップに謎の余白が現れる

結論 iOS11からScrollViewの領域がsafeArea分の余白がデフォルトで追加されます。(完全に忘れてた) 結論から言うと、この余白を追加しないようにするためにはcontentInsetAdjustmentBehaviorで.neverを選択します。 scrollView.contentInsetAdjustmentBeha…

【iOS】The number of provided view controllers xxx doesn’t match the number required xxx for the requested spine location 対処法

久しぶりに、UIPageViewControllerを使ってたらうっかりミスに悩まされたので、後世に記事を残しておきます‍♀️ 結論 おそらく、あなたがそのエラーになっているのは、setViewControllersで複数のViewControllerを設定しているからでしょう。` setViewControl…

【Swift】Viewの制約に基づいたサイズを取得

結論 下記のようにして、AutoLayoutの制約などに基づいたViewのサイズを取得することができます。 ちなみにUIView.layoutFittingCompressedSizeは、UIViewのクラスプロパティで、可能な限りサイズを小さいサイズを返します。ここでは、制約内で最も小さくな…

【RxSwift】イベントをenumに変える便利なオペレータがあった

イベントをenumに変える便利なオペレータがあったことを最近知ったので、メモしておきます👷‍♀️ reactivex.io .materialize() .materialize()は、ストリームに流れる各イベントを、それぞれEventというenumに変換します。 @frozen public enum Event<Element> { /// Nex</element>…

【iOS】Firestoreで強制アップデート機能をつける

Firestoreを使って、アプリ側の強制アップデート機能を実装したので、今回はその方法を簡単に紹介していきたいと思います‍♀️ それではやっていく まず重要なのは、現在のバージョンが必須バージョンを満たしているかどうかの条件分岐です。これは以前のブロ…

【Swift】SafeAreaを取得する

今回もSwiftの超短い小ネタです‍♀️ 結論 iOS11以降からは、下記のようにUIViewのsafeAreaInsetsからSafeAreaの幅等を取得することができます。 UIApplication.shared.windows.filter { $0.isKeyWindow }.first?.safeAreaInsets.top ?? 0 てな感じで本日は以…

Swiftで単色のUIImageを生成する

本日はSwiftの小ネタです👷‍♀️ 結論 下記のようにして、単色のUIImageを取得することができます。UIGraphicsBeginImageContext()は、GraphicsContextを作成してスタックにプッシュします。次に、プッシュされたコンテキストをUIGraphicsGetCurrentContext()で…

【Swift】reloadDataの完了後に処理を行う

本日は誰もが通るであろうUITableView/UICollectionViewの小ネタです‍♀️ 結論 UITableView/UICollectionViewのreloadData()のcompletionHandlerは公式でAPIが公開されていないので、UIView.animateを使うことでreloadData()の完了後に処理を書くことができま…

【Swift】translatesAutoresizingMaskIntoConstraintsって結局なんなんだっけ?

SwiftのコードベースでAutoLayoutを設定する時によくやるこれ。 view.translatesAutoresizingMaskIntoConstraints = false view.widthAnchor.constraint(equalToConstant: 18).isActive = true view.heightAnchor.constraint(equalToConstant: 18).isActive …

【Swift】配列の順番を保証しながら重複を除く

先日Zennを眺めていたら、面白そうな記事を見かけたので、備忘録的に残しておきます zenn.dev 結論 Swiftの配列で要素の重複を取り除く方法として、Setがありました。 Set(arrayLiteral: "a", "a", "b", "c") // ["b", "c", "a"] しかし、Setは基本的に配列…

【Swift】文字列からSelectorを生成する

結論 NSSelectorFromStringを使うことで、下記のように文字列からSelectorを生成することができるようですね let selector = NSSelectorFromString("delete:") ちなみに今回は、UICollectionViewのcollectionView(_:canPerformAction:forItemAt:withSender:)…

【Swift】タップスルーなViewを作成する

このViewのタップイベントをスルーして、背面にあるViewをタップできるようにしたいという場面は、たまに遭遇するかと思います。今回はそんな場面で使えるSwiftの小ネタについて書こうかと思います‍♀️ 結論 hitTest(_:with:)で受け取ったイベントが自分自身…

【Swift】Error protocol からエラーコードを取得する

本日もSwiftの小ネタです‍♀️ 結論 SwiftのErrorプロトコルは、codeプロパティを持たないので、下記のようにNSErrorに変換することでcodeを取得するようにします。 extension Error { var code: Int { return (self as NSError).code } } てな感じで本日も以…

【Swift】TableViewで空のCellを表示しない

本日は初学者向けの内容で、UITableViewで空のCellを表示させないための簡易的な処理を紹介したいと思います‍♀️ よくあるこれです。 結論 tableFooterViewプロパティに空のUIView()をセットすれことで、空のCellが表示されないようになります。 tableView.ta…

【Algolia】インデックスを日付でソートする

本日はAlgoliaのインデックスを日付でソートする方法を簡単に紹介していきたいと思います👷‍♀️ それではやっていく インデックスをソートするにあたり、まず大前提として知っておくべきことが二点ほどあります。一つ目は、インデックス毎に一つのランキング式…

【Swift】ClosureのCapture List再入門

Capture Listとは? キャプチャリストは、よくClosure内で強参照によるインスタンスを保持を防ぐ下記のようなもので、Closure内で、ある値のキャプチャ方法を指定する役割があります。 let hoge = {[weak self] in self.hoge() } キャプチャ方法 キャプチャ…