- 1. [TCA] enum State をstruct Stateに持たせる場合のpullback方法
- 2. ElixirDesktop iOS でカメラ撮影
- 3. SwiftUI ⌘+クリックで出るメニューでViewを分割したりする
- 4. External Link Account API の実装方法
- 5. ゆめみのインターンシップに参加した話
- 6. サイバーエージェントのインターンシップに参加した話
- 7. 【Flutter / RESTAPI】簡単なAPIをFlutterで呼び出してみた!
- 8. FlutterのiOSデバッグ起動時に Null check operator used on a null value
- 9. UICollectionViewDiffableDataSourceの挙動を理解する
- 10. iOSエンジニアを目指す26歳男
- 11. 【Swift】Date型をデコード
- 12. 【Swift】初心者による優しいデリゲート
- 13. pkgConfig を書いて NDI SDK(fat static library) をパッケージとしてアプリに組み込む
- 14. SwiftUI のツールバーの外観を UIBarAppearance で指定する方法に toolbarBackground で別れを告げる
- 15. 画面の一部でUIHostingControllerを使っているとNavigationBarを隠したいのに隠れない問題の対応方法
- 16. 【SwiftUI】関数の引数でBindingをとる方法
- 17. 次の水曜日の Date型 を取得する
- 18. XCode 14でSigning for … requires a development team.を解決
- 19. iPhone 14 ProのDynamic Islandにウィジェットを追加、Live Activityライブ・アクティビティを開始(iOS16.1以降)ActivityKit
- 20. [Combine] 複数のAnyCancellableをまとめてstoreする
[TCA] enum State をstruct Stateに持たせる場合のpullback方法
# 問題
`The Composable Architecture`の`SwitchStore`での画面出し分けをする際、enumにStateを持たせる場合、以下のようにpullbackします。“`swift:AppCore.swift
enum AppState {
case firstScreen(FirstScreenState)
case secondScreen(SecondScreenState)
}enum AppAction {
case firstScreenAction(FirstScreenAction)
case secondScreenAction(SecondScreenAction)
}struct AppEnvironment { }
let appReducer = Reducer
.combine(
firstScreenReducer
.pullback(
state: /AppSt
ElixirDesktop iOS でカメラ撮影
## はじめに
ElixirDesktop を iOS で動かそうと色々検証中
https://qiita.com/RyoWakabayashi/items/f5d97a7e857983eac7a4
今回はカメラを起動して写真を撮影し、 Elixir 側で画像処理してみました
## 実行環境
– 開発環境・デスクトップ版実行環境
– macOS Monterey 12.5.1
– モバイル版実行環境
– iPhone SE 第2世代
– iOS 15.6.1## 実装コード
デスクトップ用
https://github.com/RyoWakabayashi/elixir-desktop-camera
iOS用
https://github.com/RyoWakabayashi/elixir-desktop-camera-ios
## 参考記事
画像データの連携と画像処理部分を参考にしました
https://qiita.com/the_haigo/items/236e0e3c6cfbbd12799a
カメラ起動について参考にしました
ht
SwiftUI ⌘+クリックで出るメニューでViewを分割したりする
# 環境
Xcode Version 14.0 (14A309)
SwiftUI Tutorialの[Building Lists and Navigation](https://developer.apple.com/tutorials/swiftui/building-lists-and-navigation)を元にしています# 概要
SwiftUIでコードを扱っているとき、Viewのコードを⌘キー+クリックすることでSwiftUIに対し色々便利なことができるメニューが表示されます。![スクリーンショット 2022-09-20 13.52.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/687960/aaa2ea7f-639c-34ce-5dbb-b44305601b2c.png)
主にSwiftUIでのみ出るメニューについて説明します。
以下のSwiftUIを操作します。“`swift
struct LandmarkDetail: View {
var landmark
External Link Account API の実装方法
# External Link Account API
[ExternalLinkAccount](https://developer.apple.com/documentation/storekit/externallinkaccount):::note warn
2022年10月12日までにExternal Link Account APIを採用し、App Storeにアプリのアップデートを提出する必要があります
:::# ソースコード
“`swift
/// External Link Account
if #available(iOS 16.0, *) {
Task {
if await ExternalLinkAccount.canOpen {
do {
try await ExternalLinkAccount.open()
} catch {
ゆめみのインターンシップに参加した話
# 自己紹介
Swift歴1年ちょっとの文系大学生です。
普段はSwiftUIで個人開発をしていて、UIKitは全くの初心者です。
インターンシップに参加することに勇気が出ないよって方にインターンシップの雰囲気を伝えれたなと思います。# [インターン詳細](https://hrmos.co/pages/yumemi/jobs/0000502)
最前線で活躍するエンジニアと共に、開発を体験!– Pull-Requestベースの実践的な開発
– 先輩エンジニアとペアプロ
– テスタブルな設計とリファクタリング
– iOSアプリ開発あるある 不具合発生パターンを学習
– UIKitの鬼門 UITableView強化トレーニング
– 成果発表LT会期間: 9月1日〜9月14日
場所: オンライン(家)
内容: https://github.com/yumemi-inc/ios-training[こちら](https://github.com/yumemi-inc/ios-training)のリポジトリのREADMEに記載されているSessionをレビューを頂きながら進めていくと
サイバーエージェントのインターンシップに参加した話
# 自己紹介
Swift歴1年ちょっとの文系大学生です。
普段はSwiftUIで個人開発をしていて、UIKitは全くの初心者です。
インターンシップに参加することに勇気が出ないよって方にインターンシップの雰囲気を伝えれたなと思います。# [インターン詳細](https://www.cyberagent.co.jp/careers/students/event/detail/id=27497)
![27497_ext_03_0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/44aba2c8-ec14-47f7-6262-55e0a96ea498.png)
期間: 9月16日〜9月18日
場所: Abema Towers
内容: 「無視できない!設計が学べるiOSハンズオン」オフラインでの開催でした。
![IMG_1356.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/a143a35
【Flutter / RESTAPI】簡単なAPIをFlutterで呼び出してみた!
## 初めに
iOSやAndroidの開発を今までやってきましたが、
ここ最近はFlutterを使用して開発をしている企業も
多いのではないかと感じます。フリーランスの案件にもちらほら見かけるので、
今更かもですが勉強しなくては。。Dartは簡単に触ったので、お馴染みのAPI操作を
やってみました!## 使用するAPI
郵便番号をパラメータとして使うことで、
住所の情報がJson形式で返却されるAPIを使用します。参考:郵便番号データ配信サービス
http://zipcloud.ibsnet.co.jp/
## 環境
・Android Studio
・url_launcher: 6.1.2
・flutter_html: 2.2.1
・http: 0.13.3## 実装
全体のソースというよりは、テンプレート見たいな感じで
順に説明します。
### 0. 事前準備
“`
// ①pubspec.yamlで使用するパッケージを入力
# The following adds the Cupertino Icons font to your application.
FlutterのiOSデバッグ起動時に Null check operator used on a null value
`Flutter`のデバッグ作業中、アプリ起動時に`FirebaseAuth.instance.currentUser`の部分で`Null check operator used on a null value`のエラーが出てどうにもいかなかった時の対処法です。`flutterfire_cli`で`flutterfire configure`を試したり、`XCode`のキャッシュを削除したりする前に、
– `firebase login`で確認しても`user`の確認が取れている。
– デバッグのシュミレータでなく実機での検証は成功する。
– 周りでは動いていてコードには問題がなく、アプリケーション内部のクラッシュと判断できる。上記に該当するのであればまず、試して頂きたいのが。![スクリーンショット 2022-09-19 16.23.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1134006/4753a43e-3cf1-91de-926a-6583dd7daaca.png)
`Simula
UICollectionViewDiffableDataSourceの挙動を理解する
## 概要
Appleはここ2,3年、UITableViewからUICollectionViewへの置き換えを進めていて、自分も今までだったらUITableViewを使うような画面も最近はUICollectionViewでリスト表示を実装するようにしています。
iPhoneならリスト表示、iPadならグリッド表示みたいな画面を構成する場合もよくあると思うので、UICollectionViewで作っておく方が何かとスケールしやすいので、そのうちUITableViewはUICollectionViewに完全置換されると思っています。
それに合わせるように出てきた`UICollectionViewDiffableDataSource`を使って実装しているのですが差分更新の挙動をしっかり理解する為に色々試してみました。
(UITableViewDiffableDataSourceもありますが、ほぼ同じです)#### 開発環境
– Xcode 14.0
– iOS16.0## サンプルコード
モックデータでToDo一覧を表示し、タップすると完了状態がトグルするアプリ
挙動を確認する
iOSエンジニアを目指す26歳男
swiftを学び初めて10日が経過した。独学で学習を進めていたが、iOSアカデミアに入校することにした。現在、動画教材とアプリ制作のチャプターを学んでいるが、難しい。。これまでの数学や国語などの学習とは全く異種な学習だ。でもだから面白い。自分の知らない領域の知識を得られている。あとは自分次第。学習時間の確保と継続。今はこのふたつを徹底しながら、自分を高めていきたい?✨
【Swift】Date型をデコード
# はじめに
いままでCodableでデコードする時にデータがあるとデコードに失敗してたのでStringでデコードしてました。Dateでデコードする方法を学んだので記録しておきます。
# 方法
“`swift
let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .iso8601
let weatherModel = try decoder.decode(WeatherModel.self, from: weatherData)
“`# おわり
勉強になりました
【Swift】初心者による優しいデリゲート
# はじめに
:::note warn
間違いがあるかもしれないです。
間違っていたらコメントください
:::delegateを使ってViewに通知する方法を学んだので記録しておきます。
# 実装
“`swift:ViewController
import UIKitclass ViewController: UIViewController, SampleModelDelegate {
private let sampleModel = SampleModel()
override func viewDidLoad() {
super.viewDidLoad()sampleModel.delegate = self
// ここでリクエスト
sampleModel.fetchAPI()
}func sampleModel(_ sampleModel: SampleModel) {
print(“レスポンスが返ってきました”)
pkgConfig を書いて NDI SDK(fat static library) をパッケージとしてアプリに組み込む
> Network Device Interface (NDI) is a high performance standard that allows anyone to use real time, ultra low latency video on existing IP video networks.
[NDI](https://ndi.tv/about-ndi/) は IP ネットワーク上でビデオやオーディオを効率よく伝達する方式のひとつです。
iOS 向けの [SDK](https://ndi.tv/sdk/#download) も公開されていてダウンロードすることができます。ライブラリはパス `/Library/NDI SDK for Apple/lib/` にプラットフォームごとにインストールされますが、実体は fat な static library です。
“`
$ file /Library/NDI\ SDK\ for\ Apple/lib/iOS/libndi_ios.a
/Library/NDI SDK for Apple/lib/iOS/libnd
SwiftUI のツールバーの外観を UIBarAppearance で指定する方法に toolbarBackground で別れを告げる
## SwiftUI と `UIBarAppearance`
iOS 15 まで、SwiftUI では NavigationBar / TabBar / ToolBar などのツールバーの背景色を設定する手段がありませんでした。そのため、例えば以下のように `UIBarAppearance` を指定する方法がとられていたと思います。
“`swift
let appearance = UITabBarAppearance()
appearance.backgroundColor = .systemBackground
UITabBar.appearance().standardAppearance = appearance
UITabBar.appearance().scrollEdgeAppearance = appearance
“`しかし、この方法はグローバルな設定を書き換えてしまうので以下の記事で書かれているような問題を引き起こすことがあります。
https://qiita.com/noppefoxwolf/items/5ba81e93bef8b91f1484
ま
画面の一部でUIHostingControllerを使っているとNavigationBarを隠したいのに隠れない問題の対応方法
下記のコードのようにナビゲーションバーを隠すためsetNavigationBarHiddenを記述しているがUIHostingControllerを使用しているとナビゲーションバーが隠れない。
“`swift
class ThirdViewController: UIViewController {override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
self.navigationController?.setNavigationBarHidden(true, animated: false)
}override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.let hc = UIHostingContro
【SwiftUI】関数の引数でBindingをとる方法
# 方法
“`swift
func showModal(isPresented: Binding) {
isPresented.wrappedValue = true
}
“`:::note info
**型名**
`Binding<型名>`
::::::note info
**値の変更方法**
`wrappedValue`で元の値を取得する事ができます。
:::# おわり
忘れたとき用にメモです
次の水曜日の Date型 を取得する
### サンプルコード
“`swift
import Foundationlet calendar = Calendar(identifier: .gregorian)
let wednesdayComponent = DateComponents(weekday: 4)
let wednesday = calendar.nextDate(after: Date(), matching: wednesdayComponent, matchingPolicy: .nextTime)!print(Date())
print(wednesday)
“`出力結果
“`
2022-09-16 09:05:06 +0000
2022-09-21 00:00:00 +0000
“`https://swiftfiddle.com/xxubpj4fv5gtjmgrznxrmbvybu
### 使ったAPI
[nextDate(after:matching:matchingPolicy:repeatedTimePolicy:direction:)](https://devel
XCode 14でSigning for … requires a development team.を解決
FlutterでiOSをbuildするとき、はまったので、メモ
以下のコードをPodfileに追加
“`
if target.respond_to?(:product_type) and target.product_type == “com.apple.product-type.bundle”
target.build_configurations.each do |config|
config.build_settings[‘CODE_SIGNING_ALLOWED’] = ‘NO’
end
end
“`
iPhone 14 ProのDynamic Islandにウィジェットを追加、Live Activityライブ・アクティビティを開始(iOS16.1以降)ActivityKit
今回は、iPhone 14 Proの新エリア「Dynamic Island」にウィジェットを追加する方法についてご紹介します。また、iOS 16.1以上のデバイスで利用可能なライブ・アクティビティを追加する方法についても説明します。
![compact-format.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635330/2d217bd8-e3e0-582e-1f0a-73c4639eb5ab.png)
## 利用可能な環境
iOS 16のリリースでは。ライブ・アクティビティは除外されています。
ライブアクティビティ機能は、パブリックベータテストプログラムで一般公開されているiOS 16.1でも利用可能です。
ライブアクティビティは、ロック画面に表示されます。
iPhone 14 Proでは、Dynamic Islandエリアにもライブアクティビティが表示されます。ライブ・アクティビティはiPhoneのみです。
## Dynamic Islandの形態
Dynamic Island
[Combine] 複数のAnyCancellableをまとめてstoreする
https://qiita.com/417_72ki/items/5943700dbe5d3663512a
をCombineでもやりたいよねって話。
ただし、Combineの場合 Swift Foundation の `Set` が使われており `DisposeBag.insert(_:)` に相当するfuncが存在しないので自前で用意する必要があります。
`Set` は struct なので `mutating` を付けるのがミソ。
“`swift
public extension Set where Element == AnyCancellable {
mutating func insert(_ cancellables: [AnyCancellable]) {
cancellables.forEach {
$0.store(in: &self)
}
}mutating func insert(_ cancellables: AnyCancellable…) {
i