iOSエンジニアのつぶやき

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

Swift

AutoLayoutでtargetの比率で高さを計算

本日は初学者向けに、targetとなるViewのサイズに応じて、サイズを計算するAutoLayoutのメソッドを紹介します‍♂️ 結論 constraint(equalTo:, multiplier:) で下記のように設定することができます。multiplierにはequalToでしていしたサイズに対する割合を設…

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Fatal: supplied identifiers are not unique.' 対処法

UICollectionViewDiffableDataSourceをつかっていた際にタイトルのエラーが発生したので、対処法をかるくメモ 今回エラーが発生したのは、セクションの情報を追加するときの処理です。 var snapshot = dataSource.snapshot() snapshot.appendSections(newSec…

【Swift】UICompositionalLayout + Diffable Data Source 時の再描画処理

再描画時にcollectionViewLayoutを入れ替えて、dataSource.apply(snapshot, animatingDifferences: false)なんてことをしていたが、なんかデータのリフレッシュタイミングでIndex out of rangeになると思ったら更新の仕方が大きく勘違いしていたので軽くメモ…

【Swift】Array to Dictionary メモ

ArrayからDictionary変換したい時って、どうやったらシンプルにできるんだっけ?っていうのを忘れていたのでメモ‍♀️ 結論 reduce使えばええやん ちなみにクロージャの引数になるdictは定数なので、新しい変数を作ってデータを追加していく必要があります。 l…

【Swift】Viewの一部だけを角丸にしたい

結論 右下を角丸にする場合は、下記のように指定することで一部を角丸にできます。コードを見ればわかるように、maskedCornersは配列で指定することができるので、角丸にする部分を組み合わせることもできます。 view.layer.cornerRadius = 10 view.layer.ma…

【Xcode】imageやcolorをソースコード上に表示するTips

本日はXcodeの小ネタです imageやcolorをソースコード上に表示する Xcode8によって追加された機能により、ソースコード上にimageやcolorを表示しながらセットすることができます。 この機能はImage LiteralやColor Literalを選択することで、下記のように使…

【Swift】Cellをコードベースで構築する際にやらかした

久しぶりにUICollectionViewCellの実装をコードベースで行ったら、初心者みたいなやらかしをしたのでメモ‍♀️ やらかし やらかしの一部がこちら。そうです、動的にCellの高さが変わるような場合に、Cellが再利用されるタイミングでImageViewのframeが以前のco…

Unable to infer complex closure return type; add explicit type to disambiguateの対処方

本日はSwift初学者向けの Unable to infer complex closure return type; add explicit type to disambiguate の対処法を簡単に紹介します 結論 これはクロージャの戻り値の方をSwiftコンパイラが上手く型推論できないときに発生します。 let itemLayouts = …

【Swift】enumにnoneはなるべく使わない方がいいお話

本日もSwiftの小ネタになります‍♀️ enumにnoneを使う 特定のタイプに属さないタイプを表すとき下記のようにnoneという命名で、enumを定義することがあるかもしれませんが、このネームスペースはSwift.Optionalで定義してあるnoneと衝突する可能性があるので…

【RxSwift】Observableを再帰的に実行したい

Observableを再帰的に実行するサンプル実装をしたので、軽くメモしておきます もっといい書き方あったらコメントで教えてください! どんな状況? やりたいこととしては、データIDの配列からページネーションしながらIDを取り出し、そのIDを元にデータを取得…

【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 てな感じで本日は以…