ひとしれずひっそり

主にソフトに関することをメモしていきます。過程をそのまま書いていたりするので間違いが含まれます。鵜呑みしない様に。

Swift

UIKeyboardTypeの違いの確認

UIKeyboardTypeでどんなキー配列か一覧が欲しいということで作った。 gist.github.com

基本演算子

Swiftの基本演算子を読んで知らなかった事。 www.swiftlangjp.com Overflow演算子 Swiftでオーバーフローは通常できないが&を使うとできる。 let a = UInt8.max &+ UInt8(1) // -> 0 剰余演算子 a % b でbが負数になっても結果は変わらず

DatePickerで選択中のウインドウを閉じる方法

サンプルプロジェクトで再現できないんだけど、DatePickerで日付を選択中にモーダールビューを表示しようとすると表示できなくなる現象があって、選択を一度解除してからモーダールビュー表示しないと上手くいかない。 (NavigationViewやSheetなど何重かにVi…

SwiftUIでModal ViewがBackgroundになった時に通知させる

scenePhaseを使うとバックグラウンドになった時に通知されるのだが、Modal Viewが表示されているときは呼び出されなかった。 struct MessageView: View { @Environment(\.scenePhase) private var scenePhase @Binding var isPresented: Bool var body: some…

ITMS-90792: Invalid font

ITMS-90792: Invalid font - There was an error validating the font at '...........woff'. Font not supported by platform. 単なる選択ミスでwoff形式のファイルがプロジェクトに追加されていたためだった。 参考 stackoverflow.com

Font Picker

iOSアプリでできるだけシステムフォントを使う様にしていたが、自動でサイズ調整させようとした時に、スムーズに拡大縮小されないのでシステムではないフォントを使わざるを得ないかな。 ということで探してこちらを試してみた。 zenn.dev 以前の7セグフォン…

appのnamespace

iOSアプリで複数のバージョンを作成する場合Xcodeのターゲットを複製して変更していく。 例えば Foo アプリがあってLite版で Foo Lite を作成するとする。 するとアプリの名称はFoo Liteとなる。 しかし、NamespaceもFoo Liteとなってしまう。 クラスに属さ…

Keyboard shortcut

SwiftUI の Keyboard shortcut は簡単だ。 View に keyboardShortcut で指定するだけ。 Button() { debutPrint("Copy Action") } label: { Text("Copy") } .keyboardShortcut("c") iPadだとToolbar button に割り当てればいいだろう。 Keyboardをペアリング…

Gesture: System gesture gate timed out.

DragGestureを使っていてDragせずに長い間押しているとtimed outが表示される。 何も影響はない様だが煩わしい。 DragGestureはボタンを押した時と離した時のイベントを取りたいので使っていて、Dragするる必要はない。 1 pixel でも動かせば出ない様だが、…

Xcodeでビルドが進まなくなった

Xcodeでコンパイルしているとある時点で進まなくなってしまった。 ネットで探して試してみるも改善せず。 思い出してみるとXcode cloudのボタンが出てて、押して使ってみるかと思ったけけど、アプリ名などまだ迷ってて登録してないので、後にしようと思って…

Combine (3)

次はこちら developer.apple.com Combine framework Combine frameworkはEventを宣言的なアプローチ(a declarative approach)で提供できる。 Delegateを使った複数のCallbackやHandlerを使用したClosure処理よりも、イベントを一つの処理chainとして作ること…

Combine (2)

ここを読んでいる。 developer.apple.com Publisher Publisherはprotocolである。 upstream publisherから値を受け取る。 それを発行する Publisherはchainすることができて、間に入ったPublisherはデータを加工したりするのに使える。 最終のPublisherからS…

Combine (1)

SwiftUI で Timer を使用した時に Publisher というのがあって、TimerはPublisherという機能と関係があるんだ程度の認識だった。 なんとなく使えてるからいいかなとは思っていたが、理解できてないのはなんとなく気持ち悪い。 developer.apple.com やっぱり…

Background処理ではDispatchQueue.mainに気をつけろ

iOSアプリでバックグラウンドに移った時に区切りのいいところまで実行させたい時にバッググラウントでの処理を要求する必要がある。 こんな感じ private var taskIdentifier: UIBackgroundTaskIdentifier! func becomeBackground() { taskIdentifier = UIApp…

同時並行処理(Concurrency) 難しい

ThreadとかDispatchQueueとかは経験あるけど非同期関数やらタスクは馴染みがない。 swift-programming-language-jp.gitbook.io Actor Actorはタスク間で情報を共有したいときに安全に情報を共有できる。 Actorの変更は1つのTaskからのみのため。 Sendable 型…

onChange に気をつけろ(onChangeだけじゃないけどな)

SwiftUIで onChange を使ったらハングアップしてしばらくしてからクラッシュする現象が出た。 なんかViewが再帰的に呼び出されている様でクラッシュに至る様だ。 ストップボタンもしばらく受け付けてくれない様な状況で、クラッシュするのを待つだけしか手が…

Protocolにoptionalなmethodを含めれる?

Objective-Cではoptionalなmethodを含めることができた。 Swiftではどうか? 検索すると @objc と optional を付けるとできる様だけど、StructureやEnumに適用できなくなるということらしい。 Swift流にするならoptionalの代わりにextensionでデフォルトの実…

ファイルのインポートやURL Schemeの処理は onOpenURL を使用する

SwiftUIの前は、ファイルのインポートやURL Schemeで呼び出される際にAppDelegateやSceneDelegateでコールバックが行われていた。 SwiftUIでもUIApplicationDelegateAdaptorでAppDelegateと同じ様なことができる。 struct MyApp: App { @UIApplicationDelega…

Structureは継承できない

オブジェクトのシリアライズでStructureを定義するとjsonなどに変換しやすくなる。 既存ソフトの置換えをしていて次の様な流れで処理しようとしている。 Export Object(Class) -> Struct -> JSON Import JSON -> Struct -> Object(Class) Classは継承したも…

willSave()はsetPrimitiveValue(:forKey)を使え

Core Dataを使っていて保存前に作成時刻や更新時刻を記録したい時にwillSaveのタイミングで記録できる。 developer.apple.com とりあえずカスタムクラスを作成して、willSaveで普通にプロパティで設定してみる。 import Foundation import CoreData @objc(It…

余白を押した時に反応させる場合はcontentShapeを使う

ListやFromを使用した時のCellにTextを使ったとして、表示される文字を押すと反応するが、余白を押すと反応しない。 contentShape()を使用すると余白にも反応する。 毎回忘れて検索するので、書いておく。 struct ContentView: View { @State var showingAle…

setPrimitiveValue(_:forKey:)でhasChangesにならない

CoreDataでdynamic propetyが作られる。 @NSManaged public var name: String? 素のままではなく加工して使いたい場合にdynamic propetyの代わりにprimitiveValueやsetPrimitiveValueを使う。 @objc public var name: String { get { return primitiveValue(…

TextFieldでOptional値を扱う場合の改善

前に書いたTextFieldでOptional値を扱う場合にView内の@State属性を付けたメンバー変数に一旦渡して処理する方法を試した。 メンバー変数に値を渡すタイミングとしてonAppear()を使っていた。 TextField - ひとしれずひっそり onAppear()は描画時に1回呼ばれ…

UndoManagerの実装

ViewにToggle Swithを置いてOn/Offさせ、その操作のUndo/Redoを試す。 変更を通知できる様にObservableObjectをアダプトする。 objectWillChangeというプロパティが使える様になり、変更前にsend()を送ることでViewに更新が必要な事を伝えることができる。 …

オブジェクトからクラス名を取得するやクラス名からオブジェクトを生成

現時点でSwift流のやり方は分かってない。 従来からあるNSClassFromString()、NSStringFromClass()を使う。 オブジェクトからクラス名を取得 class A {} NSStringFromClass(A.self) // -> "__lldb_expr_13.A" 空間名(という表現でいい?)がAの前につく様だ。…

static property のoverride

Swiftでクラスに属するpropertyやmethodはstaticキーワードで定義するが、staticはオーバーライドできない。 こちらを参照するとstaticの代わりにclassキーワードを使ってcomputedにするとオーバーライドできる様だ。 software.small-desk.com class A { cla…

Navigation Viewで子Viewから左上ボタンで戻る時に何かさせたい時

こちらに書かれていた。 stackoverflow.com struct MyView: View { @Environment(\.isPresented) var isPresented var body: some View { Rectangle() .onChange(of: isPresented) { newValue in if !newValue { print("detail view is dismissed") } } } }

The Basics

Swiftで8進数ってなんと表現する?と思って引っかかったサイト。 docs.swift.org 今まで他人のBlogやコードでSwiftをかじってきて何となくの理解だったのがここを読んで知らないことだらけと気づいた。 今後少しずつ読み進めていこう。 Taplsは知らなかった…

[[self class] new]をSwiftで行う

objcだと頻繁に使ってた[[self class] new]をSwiftではどうやるか? 調べたらすぐ見つかって、こうすれば良いみたい。 [self class]はtype(of: self)に置き換えられる。 required init()が必要になるのが肝の様だ。 requiredって何? gist.github.com メソッド…

XCTest で setup

テストクラスをNewするとsetUpWithError()が含まれている。 ここでメンバ変数を初期化して準備しようとするとエラーでコンパイルできない。 メインのプロジェクト(Test)でAというクラスを定義 import Foundation class A { func foo() -> Int { return 0 } }…