投稿

ラベル(Swift)が付いた投稿を表示しています

SimpleLoggerをSPMに公開しました — コツコツ、ここからはじまる

SimpleLoggerをSPMに公開しました — コツコツ、ここからはじまる 勢いで作った小さなライブラリを、ついに Swift Package Manager (SPM) に公開しました。 名前は「 SimpleLogger 」。 その名の通り、ただログを出すだけの、とてもシンプルなロガーです。 なんで作ったのか 開発中、 print() でログを出すことが多いんですが、 「もう少しだけ使いやすく、ちょっと整った形で出したい」 そんな軽い気持ちで書き始めたのがきっかけです。 機能的にはとても単純。 ログレベルを分けたり、日付を出したり。 どれも“便利”と呼ぶにはまだまだなレベルですが、 「自分がよく使う形」に整えるのは意外と楽しい。 SPMに登録してみた 「せっかくだし公開してみよう」と思い、勢いでSPM対応にしました。 手順自体は簡単なんですが、 実際に「パッケージ名で検索して出てくる」のは、なんだか少し嬉しい瞬間ですね。 これから 正直、今のSimpleLoggerは 本当にシンプル です。 でも、こういう“ちょっとした自作ツール”が積み重なっていくと、 自分専用の開発環境がどんどん育っていく気がしています。 これが、コツコツ始める第一歩。 時間をかけて少しずつ、使える形に育てていきます。 📦 SimpleLogger on GitHub 👉 https://github.com/kixking/SimpleLogger ※AIに書いてもらいました。

Swift最強プロンプト術

Swift最強プロンプト術 Swift開発を効率化するためのコード自動生成テクニックと、厳選したプロンプトパターン3選を紹介します。 はじめに SwiftはAppleプラットフォームでのアプリ開発に広く使用されている言語です。しかし、繰り返しのコーディングや設計パターンの実装は開発効率を下げる原因となります。本記事では、Swiftにおけるコード自動生成の技術と、最強の効率化を可能にするプロンプトパターン3選を紹介します。 Swiftにおけるコード自動生成の重要性 コード自動生成は、開発の一貫性を保ちながら、時間と労力を大幅に削減する手段です。特にSwiftでは、構造化されたコードを書く必要があり、テンプレート化・自動化の恩恵が大きくなります。この章では自動生成の意義と現在使われている手法の概要を説明します。 コード自動生成を活用するメリット 開発スピードの向上 ヒューマンエラーの削減 チーム間でのコーディングスタイル統一 これらのメリットを最大限に活かすには、適切なプロンプト設計が鍵となります。 プロンプトパターン1:基本構文生成 最初のパターンは「構造化された基本的なSwiftコードの自動生成」です。例えば、モデル定義やプロトコル準拠のテンプレートなど。以下のようなプロンプト例を紹介します: 「SwiftでCodable準拠の構造体を定義してください。プロパティは名前(String)、年齢(Int)、メール(String)です。」 このようなプロンプトで、迅速に正確な雛形コードを生成可能です。 プロンプトパターン2:機能特化型コード生成 このパターンでは、UIコンポーネントやAPI通信など、特定の機能に特化したコードの生成を目指します。例: 「SwiftUI...

【Swift】テストできない、純粋関数を意識しようよ。

はじめに SwiftUIでアプリを開発していると、 View の中にロジックを書いてしまい、いざ単体テストをしようとするとテストできない……そんな経験はありませんか? 「実装者がどこまで想定して動作確認をおこなったのか分からない」「テストがしにくく、バグが潜んでいても気付きにくい」など、テストのしづらさは品質の低下につながります。 そこで重要なのが 純粋関数(Pure Function) です。本記事では、純粋関数を活用して、テストしやすいコードを設計する方法について解説します。 SwiftUIのViewの中にロジックを書くと何が問題? SwiftUIでは、 View の中にロジックを書くと次のような問題が発生します。 1. テストが困難になる View はUIの描画を行うためのものであり、状態を持つことが多いため、 純粋に入力→出力の関係に基づいたテストができなくなる ことが多いです。 struct ContentView: View { @State private var count: Int = 0 var body: some View { VStack { Text("\(count)") Button("Increment") { count += 1 } } } } この例では、ボタンを押すたびに count が増えますが、 このロジックを単体テストしようとすると、UIのイベントをシミュレートする必要があります。 2. 動作確認の範囲が曖昧になる 実装者がどの条件を想定して動作確認を行ったのか分からないため、 バグが潜んでいても気付きにくくなります。 純粋関数を活用しよう 純粋関数とは、 副作用がない(外部の状態を変更しない) 同じ入力に対して常に同じ出力を返す という特性を持つ関数のことです。 純粋関数を用意すると、テストがしやすくなります。 例:ビジネスロジックを分離する 先ほどの count の更新を純粋関数に切り出してみましょう。 func increment(_ value: Int) ...

【iOS】今更聞けない UIViewControllerのライフサイクル その2 (Swift)

【iOS】今更聞けないUIViewControllerのライフサイクル その2 (Swift) 過去に書いていたのですが、意外と観ていただいている人がいたので、更新版です 忘れやすいですよね もう少し、細かいイベントを追加しました 表示する時 awakeFromNib loadView viewDidLoad loadViewIfNeeded viewWillAppear viewLayoutMarginsDidChange viewSafeAreaInsetsDidChange updateViewConstraints viewIsAppearing viewWillLayoutSubviews viewDidLayoutSubviews viewDidAppear 別ページ表示する時 viewWillLayoutSubviews viewDidLayoutSubviews viewWillDisappear viewWillLayoutSubviews viewDidLayoutSubviews viewDidDisappear import UIKit class ViewController: UIViewController { override func awakeFromNib() { super.awakeFromNib() print("awakeFromNib") } override func loadView() { super.loadView() print("loadView") } override func viewDidLoad() { super.viewDidLoad() print("viewDidLoad") } override func loadViewIfNeeded() { super.loadViewIfNeeded() print("loadViewIfNeeded")...

【Swift】Zipファイル判定

Swiftで ZIP判定用です。 もっとスマートなやり方は有ると思いますが暫定で作成です。 よく見かける物を関数にしたもの。 ・ファイルを読み込む。 ・先頭4byteを取得 ・ZIPのheaderをcheckしてZIPのheaderならtrue を返す

【iOS】 アプリ内でTweetしたい場合、Swifterがベストかな?

こんにちは、 アプリ内でTwitterの投稿をしたく、色々とSDKを探していました。 TwitterKitはすでに、開発中止だったので。公式にあったSwifterが、 一番まともそう。  でも、これって、Swift 用のライブラリです。 Objective-Cでは無いんです。 探しても、流石にもうない様子。 なので。 Objective-Cでも使えるように、検討しました。 そしたら・・・・。  なんと!! 普通に利用できました。 そのまま、利用する事ができなかったので、 ラップする、Swift のコードを書いて、そのラップしたコードを Objective-C側から呼ぶようにすれば、できました。

【iOS】Swiftでtransformのスケールを制御! 最大・最小倍率の設定方法

メモですが・・・・。 let max = 10.0 let min = 0.5 let  scale =  sqrt ( abs ( self . transform . a  *  self . transform . d  -  self . transform . b  *  self . transform . c )) if (scale >  max ){  self . transform  =  self . transform . scaledBy (x:  max  / scale, y:  max  / scale) } else   if (scale <  min  ){  self . transform  =  self . transform . scaledBy (x:  min  / scale, y:  min  / scale) }

【iOS】指定の言語のStringを取得したい時

多言語化を実装されていて、とある要件で日本語の端末の状態で、 日本語と英語だった場合のStringがほしい時に書きました。 ja.lproj とか en.lproj とかを直接読み込んで、やってます。 引数に、 en とか iOS でローカライズ化した言語を指定する。 key は、ローカライズのkeyです。 エラー処理等は入れて無いので、適宜やってね。 func SelectLocalizeString(lang: String ,   key: String ) -> String {      let p: String ? = Bundle . main . path (forResource: lang, ofType: "lproj" )     let b: Bundle ? = Bundle (path: p!)     return NSLocalizedString (key, tableName: nil , bundle: b!, value: key, comment: nil ) }

【iOS】UIViewControllerのライフサイクル (Swift)

いまさら聞けない、 Swift UIViewControllerのライフサイクル  下記が主なイベント class ViewController : UIViewController {     override func viewDidLoad () {         super . viewDidLoad ()         print ( "viewDidLoad" )     }          override func viewWillAppear ( _ animated: Bool ) {         super . viewWillAppear (animated)         print ( "viewWillAppear" )     }     override func viewDidAppear ( _ animated: Bool ) {         super . viewDidAppear (animated)         print ( "viewDidAppear" )     }     override func viewWillLayoutSubviews () {         super . viewWillLayoutSubviews ()         print ( "viewWillLayoutSubviews" )     }     override func viewDidLayoutSubviews () {   ...

【iOS】UILabelでヒラギノフォントの上下が切れる問題と対処法

イメージ
iOS で開発していると、フォント指定がありますが、 ヒラギノフォントを指定した場合、 UILabel ( UIButton ) で表示しようとすると文字が切れるやつがいます。 特に、sizeToFit() を呼ぶと結構悲惨です。 切れる可能性がある文字たちは下記 ① gjpqy Ä Ö Ü ß ĀĂĄąĆĈĊČĎ Ņ gjの文字が消えないように検索したら、 他のサイトでは、 NSAttributedString.Key.baselineOffset: NSNumber(value:1.0) とか位置少し上にずらして attributedText に入れるとか記載がありますが完全ではありませんでした。 Ä Ö Ü の「..」のなどの部分が切れてしまいます。  そこで、どうしてもだめだったら、完全では無いですが、 下記を試して見てください。 clipsToBounds = false 意外と盲点だったりします。 まぁ、画面上下ピッタリの場合はだめかも知れませんが. こんな感じに表示可能です。(赤が本来のViewの領域)

【iOS】swift4 ナビゲーションコントローラー 非活性化

タイトル通りで、 ボタンを押せなくする方法。 self . navigationController ?. navigationBar . isUserInteractionEnabled = false ちゃんと、押せるように戻すようにしておくこと!

【iOS】swift の 配列を for する時、、、

Swift 4で確認済み ちょっと恥ずかしい話、 var array = [ "1" , "2" ] for i in 0 ... array . count - 1 {          print ( array [i]) } ↓ こう書けば良かったんだ。 for i in 0 ..< array . count {          print ( array [i]) } いや、必ず要素が1個以上ある場合は、いいんだけど。 要素が0個の時、強制終了する。

【iOS】SwiftでCGAffineTransformから角度・ラジアン・度数・スケールを計算する方法

メモ Swift 4 でtransformから角度、ラジアン、ディグリー、スケールを求める 忘れがちなので・・・。 let transform = view.transform let radians = atan2(transform.b, transform.a) let degrees = radians * 180 / .pi let scale = sqrt(abs(transform.a * transform.d - transform.b * transform.c)) import CoreGraphics extension CGAffineTransform { var angle: CGFloat { return atan2(b, a) } var radians: CGFloat { return angle } var degrees: CGFloat { return angle * 180.0 / CGFloat.pi } var scale: CGPoint { return CGPoint(x: sqrt(a * a + c * c), y: sqrt(b * b + d * d)) } } // 例として、適当な CGAffineTransform を作成 let transform = CGAffineTransform(rotationAngle: CGFloat.pi/4).scaledBy(x: 2.0, y: 1.5) let angleInRadians = transform.radians let angleInDegrees = transform.degrees let scale = transform.scale print("Angle in radians: \(angleInRadians)") print("Angle in degrees: \(angleInDegrees)") print("Scale: \(scale...

Locale.availableIdentifiers の中身 iOS 12

iOS 12   iPhone7 にて確認して現在は797 種類あるようです。 let i dentifiers = Locale . availableIdentifiers ▿ 797 elements   - 0 : "eu"   - 1 : "hr_BA"   - 2 : "en_CM"   - 3 : "en_BI"   - 4 : "rw_RW"   - 5 : "ast"   - 6 : "en_SZ"   - 7 : "he_IL"   - 8 : "ar"   - 9 : "uz_Arab"   - 10 : "en_PN"   - 11 : "as"   - 12 : "en_NF"   - 13 : "ks_IN"   - 14 : "es_KY"   - 15 : "rwk_TZ"   - 16 : "zh_Hant_TW"   - 17 : "en_CN"   - 18 : "gsw_LI"   - 19 : "ta_IN"   - 20 : "th_TH"   - 21 : "es_EA"   - 22 : "fr_GF"   - 23 : "ar_001"   - 24 : "en_RW"   - 25 : "tr_TR"   - 26 : "de_CH"   - 27 : "ee_TG"   - 28 : "en_NG"   - 29 : "fr_TG"   - 30 : "az"   - 31 : "fr_SC" ...

Swift ログ出力

ログ出力メモ Swift フラグで持たせても良いし、buildで分けるのでもよい。 class MyLog{           static func d( _ str: String ){         #if DEBUG                 print (str)         #endif     } } こんな感じに使う。 MyLog.d("aaaa")