- 1. Codableで複数の型を取りうる配列を持つJSONに対応する
- 2. Swift Codableの公式解説をちょっと補足
- 3. SwiftのComputed PropertiesはFunction内でも宣言できる
- 4. Swiftで[String: Any]型の等価性チェックをする
- 5. iOS Simulatorが起動しない時の対処法
- 6. 【Android Java】いまさら聞けないActivityとは?
- 7. 【Xcode】コードスニペットについて
- 8. collectionViewのFallbackでクラッシュ
- 9. [Swift] structのMemberwise Initializerを残しつつカスタムのInitializerも実装する方法
- 10. クラウド上のスマホ?!RemoteTestKitを実際に使って見た!【RemoteTestKit】
- 11. 【Swift】アプリのバージョン情報を表示
- 12. 【SwiftUI】TimelineViewを使ってデジタル時計を作る
- 13. 【React Native】Expo製のiOSアプリでService Workerを使う
- 14. Apple キャンペーンリンクの作り方
- 15. Bitriseのビルド環境に事前にインストールされているものが何かを知る方法
- 16. [Swift] 一度だけ変更可能なプロパティを実装する方法
- 17. Xcode13でsalesforceHybridAppをビルドできないことの対応
- 18. 【SwiftUI】図形の表示
- 19. WWDC2022で発表されたSwiftUIで使えるハーフモーダルを少し調べた
- 20. 【Flutter】Swift Compiler Error (Xcode): Cannot find ‘GeneratedPluginRegistrant’ in scopeを解決する
Codableで複数の型を取りうる配列を持つJSONに対応する
とあるAPIのレスポンスをデコードする処理を書いていて、以下のように配列の中の型が複数あるケースに対応する必要がありました。
“`json
{
“products”: [
{
“id”: 1,
“type”: “FOO”,
“foo”: “foofoo”,
“bar”: “barbar”
},
{
“id”: 2,
“type”: “BAZ”,
“baz”: “bazbaz”,
“qux”: “quxqux”
}
],
“next”: “xxxxxxx”
}
“``id`と`type`のように、一部共通のプロパティも持っていて、これらを抽象的な型でまとめて表現したいというモチベーションもありました。
参考になる(というかほぼそのまま使える)コードをStackOverflowで見つけてなんとか実現
Swift Codableの公式解説をちょっと補足
Codableについての公式の解説記事はこちらですが、JSONの具体例がなかったり読んでるだけだと若干わかりづらいところがあったので、自分なりに補足をつけてみたいと思います。主にCodingKeys周りを見ていきます。
https://developer.apple.com/documentation/foundation/archives_and_serialization/encoding_and_decoding_custom_types
# 具体的なJSONで理解する
解説記事のコードをまとめるとこんな感じです。デコード部分に絞ってます。“`swift
struct Coordinate {
var latitude: Double
var longitude: Double
var elevation: Doubleenum CodingKeys: String, CodingKey {
case latitude
case longitude
case addition
SwiftのComputed PropertiesはFunction内でも宣言できる
SwiftのComputed PropertiesはFunction内でも宣言できます。
“`swift
struct State {
var foo = “foo”
}var state = State()
func testComputedProp() {
var result: Bool { // ここにComputed Propertiesが宣言できる!
someLogic(str: state.foo)
}
print(result)
state.foo = “bar”
print(result)
}func someLogic(str: String) -> Bool {
return str == “bar”
}testComputedProp()
// 以下の順で出力される
// false
// true
“`限定的な具体例になっちゃいますが、、
TCAのReducerを実装してるときに、同じデータ取得のコードをあちこちに書いていました。“`swi
Swiftで[String: Any]型の等価性チェックをする
Swiftで以下のコードはコンパイルエラーになります。
Any型がEquatableに準拠していないというのが理由です。“`swift
let dict1: [String: Any] = [“foo”: “bar”]
let dict2: [String: Any] = [“foo”: “bar”]
print(dict1 == dict2) // Protocol ‘Any’ as a type cannot conform to ‘Equatable’
“`そこで、以下のように[String: Any]をNSDictionaryにキャストして比較します。
こうするとコンパイルすることができ、結果は`true`になります。“`swift
let dict1: [String: Any] = [“foo”: “bar”]
let dict2: [String: Any] = [“foo”: “bar”]
print(dict1 as NSDictionary == dict2 as NSDictionary) // true
“`
iOS Simulatorが起動しない時の対処法
最近、Flutterアプリの実行をする際に溜まったキャッシュなどでiOS Simulatorが起動しなくなることが頻発したので、その対処法を残します!
まだまだ浅学で少し誤った情報があるかもしれないので、その点を考慮して読み進めてもらえると幸いです?# 対処法
以下の手順で試していくと、解決します!
手順を試す→iOS Simulatorの動作確認、の流れで動作確認失敗した時に
以下の手順を進めていきましょう?
1. iOS Simulator関連の削除
1. coreSimulator/casheの削除
1. DerivedDataの削除
1. iOS DeviceSupportの削除
1. Library/Cachesの削除## 1. iOS Simulator関連の削除
iOS Simulatorの表面的なキャッシュを削除します。
“`zsh
# シミュレーターの一覧表示
xcrun simctl list devices# 使えないシミュレーターを削除
xcrun simctl delete unavailable# キャッシュの削除
xcrun –kill
【Android Java】いまさら聞けないActivityとは?
## はじめに
Android Javaって何?という初学者向けの記事になります。
アンドロイド特有の`Activity`についての内容です。仕事でAndroid Javaを使って修正、開発をしています。
業務に携わってから約半年が経ちました。Android Javaを使うにあたって、学んだことをアプトプットしようと思い記事にしました。
エンジニアになって1年の未熟者なので暖かい目で見ていただけると助かります。
## あなたは誰?
> 現職:SESエンジニア(歴1年)
前職:営業
年齢:27歳
使用言語:Java, Android Java, C++
工程:テスト、実装(設計もやってみたい…)
好きなこと:サウナ/登山/ダーツ/ピアノ/酒/運動全般
もくもく会主催:[新宿もくもく会](https://shinjuku-realize0707.connpass.com/)## Acyivityとは
簡単に言うと`Activity`とは、スマホでいう**一つの画面全体**のことを言います。
【Xcode】コードスニペットについて# はじめに
コードスニペットとは?
正確かはわかりませんが私の認識では、「何度も使うコードを定型文として登録する」みたいな感じで思っています。今回はSwiftUIでダークモードを検知する事ができるコードを登録します
`@Environment(\.colorScheme) var colorScheme`これ毎回忘れて必ずググっちゃうんです笑
# やり方
登録したいコードを選択します。
![スクリーンショット 2022-07-02 16.45.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/a0947b81-5fae-9cfa-c2da-75e86f310cd7.png)選択したコードの上で右クリックします。
「Create Code Snippet」を選択します。
![スクリーンショット 2022-07-02 16.47.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745
collectionViewのFallbackでクラッシュ
# きっかけ
tableViewで
“`tableViewController.swift
if hoge {
return UITableViewCell()
}
“`
このようにFallbackしていて、同様にcollectionViewにも
“`collectionViewController.swift
if hoge {
return UICollectionViewCell()
}
“`
としていたらクラッシュしてしまった。【クラッシュログ】
“`
Terminating app due to uncaught exception ‘NSInternalInconsistencyException’, reason: ‘the cell returned from
– collectionView:cellForItemAtIndexPath: does not have a reuseIdentifier
– cells must be retrieved by calling
– dequeueReusableCellWithReuseId
[Swift] structのMemberwise Initializerを残しつつカスタムのInitializerも実装する方法
Swiftの構造体(struct)は**Initializerを一つも実装しない場合**にMemberwise Initializerと呼ばれるInitializerが自動で生成されます。
> Structure types automatically receive a memberwise initializer if they don’t define any of their own custom initializers.
https://docs.swift.org/swift-book/LanguageGuide/Initialization.html
例えば、以下のUser型にInitializerは定義されていませんが、コンパイラが自動でMemberwise Initializerを与えてくれます。
“`swift
struct User {
let firstName: String
let lastName: String
}
“`よってこのような初期化が可能です。
“`swift
クラウド上のスマホ?!RemoteTestKitを実際に使って見た!【RemoteTestKit】
# はじめに
開発中のアプリを動かす時「こっちのデバイスだとレイアウトが崩れた」
「iOSだとここの処理がうまく動かない」
「最新のスマホではどうなるんだろう」なんてことありますよね。
しかしそのためにわざわざ実機を用意するのは大変だと思います。
そこで、この問題を解決するサービスが「RemoteToolKit」と言うサービスです。# 概要
「RemoteTestKit」は簡単に言うと、クラウド上のスマホやタブレットを借りれるサービスです。なんと、利用可能な端末はなんと1132件もありました!(2022 7月1日現在)
ラインナップはAndroid 2.3.3などの古いOSから最新のAndroid 13まで幅広くあります。
下のリンクから利用可能な端末を一覧で見れるので是非見てみてください~~https://appkitbox.com/testkit/devicelist/
# 使い方
RemoteTestKitにはWeb版と、ソフトウェア版があります。
ソフトウェア版のほうが圧倒的に便利なので、ソフトウェア版の利用をオススメします!
このソフトはWindow
【Swift】アプリのバージョン情報を表示
# はじめに
アプリ内でこのような表示を見たことはありませんか?
![IMG_0579.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/2b9c3adb-a88c-04ea-e81e-96f0a555e093.jpeg)
これはXcodeで設定できるIdentityのVersionとBuildで構成されているアプリのバージョン情報です。
![スクリーンショット 2022-07-01 15.16.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/3539297f-cb5c-83ce-1d35-bb4caf84721f.png)バージョンの設定をどのように取得するのでしょうか
今回はやり方を紹介します
# 方法
## Version
“`swift
var version: String {
guard let version = Bundle.main.object(for
【SwiftUI】TimelineViewを使ってデジタル時計を作る
# はじめに
iOS15から`TimelineView`というものが登場していたらしいです
コンポーネント一覧を見ていたら発見しました笑
気になったので`TimelineView`を使用して簡単なアプリを作成しようと思います。# 完成形
![Videotogif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/257b146a-ef0d-f222-e6ed-69b67fab5b3f.gif)# 完成コード
“`swift
import SwiftUIstruct ContentView: View {
var body: some View {
GeometryReader { geo in
ZStack(alignment: .center) {
Color(red: 132/255, green: 209/255, blue: 78/255).edgesIgnoringSafeArea(.al
【React Native】Expo製のiOSアプリでService Workerを使う
以前開発していたExpo製のアプリでService Workerを使用することになったのですが、Androidでは問題なく動作するのに対して、iOSではService Workerが動作せずハマりました。
というのも、iOSのWKWebViewではデフォルトでService Workerが使用できないようになっているためでした。
わかってしまえば簡単ですが、WKWebViewでService Workerを使用するための設定や手順で躓いた点をまとめました。# iOSにおけるWebView
大前提として、iOSのWebViewにはWKWebViewとSFSafariViewControllerがあり、Service Workerを使用できるバージョンやカスタマイズできるポイントが異なります(UIWebViewは非推奨なので除外してます)。|| WKWebView | SFSafariViewController |
|:-:|:-:|:-:|
|Service Worker|iOS 14.0から使用可能|iOS 11.3から使用可能|
|見た目のカスタマイズ|自由にカスタマイズ可
Apple キャンペーンリンクの作り方
### これは
本業でキャンペーンリンクについて調べたので、備忘録を兼ねてまとめます。キャンペーンリンクとはアプリまでのURLに任意のパラメータを付与したもので、
そのパラメータごとのダウンロード数を見ることができます。基本的にこちらを参考にしてますが、少しわかりづらいところもあるので、下に詳しく書きます。
[キャンペーンリンクとは](https://developer.apple.com/jp/app-store/measuring-app-performance/)
[キャンペーンリンクの作り方](https://help.apple.com/app-store-connect/?lang=ja#/itcfa7936330)### 実際の作り方
1.App Store Connectにログインして、”Appアナリティクス”を選択します。
![スクリーンショット 2022-06-30 17.09.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393442/cd5a460a-
Bitriseのビルド環境に事前にインストールされているものが何かを知る方法
Bitriseのビルド環境(Stackと呼ぶ)では、HomebrewやCocoaPods、Bundlerなど、iOSアプリをビルドするために必要なツールが事前にインストールされています。
ただ、これらのツールのバージョンがいくつなのか、他にどんなツールがインストールされているかを知りたいことがあります。実は、以下のリポジトリにStackに関する情報がまとまっています。
https://github.com/bitrise-io/bitrise.io
例えば、現在の最新版であるXcode13.4のStackの情報はこちらです。
https://github.com/bitrise-io/bitrise.io/blob/master/system_reports/osx-xcode-13.4.x.log
Homebrewのバージョンは`3.4.11`であることがわかります。
![Cursor_と_https___raw_githubusercontent_com_bitrise-io_bitrise_io_master_system_reports_GEN
[Swift] 一度だけ変更可能なプロパティを実装する方法
初期値はnilで、その後1回値を代入したら、その後何度代入しても値が変わらないプロパティを実装したい。
didSetを使うと、以下のようにシンプルに実装できました。
“`swift
struct User {
var id: Int? {
didSet {
if oldValue != nil {
id = oldValue
}
}
}
}
“`“`swift
var user = User()
print(user.id) // 初期値はnil
user.id = 1
print(user.id) // 1に変わった
user.id = 2
print(user.id) // 1のまま変わらない
“`
Xcode13でsalesforceHybridAppをビルドできないことの対応
1.legacy build system から new build systemに変更
そしてmultiple commands produceというエラーがありました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/736127/f21f1dbc-daf6-e409-3940-a99f35794b1e.png)2.ターゲット配下のCordovaLibを右クリックしてremove from referenceを選択。 そしてビルドできるはず。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/736127/c8248e29-9537-c6d6-64e4-72430cad3908.png)
【SwiftUI】図形の表示
# カプセル型
![Simulator Screen Shot – iPhone 12 – 2022-06-29 at 15.57.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/e9fedac0-6481-cdd8-051f-b4c9515e4a92.png)
“`swift
import SwiftUIstruct ContentView: View {
var body: some View {
Capsule()
.frame(width: 100, height: 50)
}
}
“`
# 円形
![Simulator Screen Shot – iPhone 12 – 2022-06-29 at 16.00.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/d1ec8439-94be-2a45-7f7e-5d
WWDC2022で発表されたSwiftUIで使えるハーフモーダルを少し調べた
## まえがき
2021年のWWDCでUIKitでハーフモーダルが発表され、
SwiftUIでも欲しい、、、!自作したり、
PartialSheet https://github.com/AndreaMiotto/PartialSheet
を使っていたりしましたが、
公式にiOS16から出たので、どんなものか軽く調査していきます。“` swift
struct ContentView: View {
@State var showModalSheet = falsevar body: some View {
Button(“シートを開く”) {
showModalSheet = true
}
.sheet(isPresented: $showModalSheet) {
ZStack {
Color.gray.opacity(0.3)
Text(“test”)
}
【Flutter】Swift Compiler Error (Xcode): Cannot find ‘GeneratedPluginRegistrant’ in scopeを解決する
`flutter build ios`で謎のエラーが出るようになってしまった・・・
“`
$ flutter build ios(中略)
Failed to build iOS app
Error output from Xcode build:
↳
2022-06-28 17:54:50.481 xcodebuild[72631:2386405] Requested but did not find extension point with identifier Xcode.IDEKit.ExtensionSentinelHostApplications for extension Xcode.DebuggerFoundation.AppExtensionHosts.watchOS of plug-in
com.apple.dt.IDEWatchSupportCore
2022-06-28 17:54:50.481 xcodebuild[72631:2386405] Requested but did not find ext