Karakuri.com

ベンチャー企業で働くソフトウェアエンジニアの技術録

Swift

Swiftで暗号ライブラリCommonCryptoを使ってAESや3DESなど導入する

WindowsやAndroidは暗号ライブラリが豊富にあるので困らないのですが、iOSのSwiftだと暗号ライブラリが少なくとても大変です。有志が様々なライブラリを作ってはいるのですが、例えば3DESだと対応しているライブラリは皆無です。結局iOSに標準で入っているCo…

Swiftで一部の画面の回転禁止を導入したらiOS9はsupportedInterfaceOrientations was invoked recursivelyと例外が飛んでクラッシュする

iOSアプリ開発で、デザインの問題で一部の画面だけ回転を禁止にする必要が生じました。この一部の画面だけ回転を禁止するというのはUX的に問題があるのはそうなのですが、同時にAppleとしても推奨していないことのような気がします。案の定、iOS9でクラッシ…

XcodeのFrameworkでBridging Headerは使えないのでmodule.modulemapを追加してエラー回避する

外部ライブラリをラップするライブラリを作成して社内で使いまわすということをWindowsやAndroidでは当然のようにやってきたのですが、iOSでは簡単にできない場合があります。それはObjective-Cで書かれたライブラリをSwiftのFrameworkでラップする場合です…

SwiftとiOSで定期的なバックグラウンド処理の実行は不可能なので諦めるべき

AndroidやWindowsではバックグラウンドで定期処理を実行することは比較的容易です。これと同様にiOSでも同じ機能を実装しようとすると問題に直面します。直面するというか、その機能はiOSでは実装できません。 iOSのバックグラウンド処理 UILocalNotificatio…

SwiftのisEmptyやCountはnilを返す可能性があることを忘れてしまう

C#でstring.Emptyを多様しているせいか、SwiftのisEmptyがnilとなることを想定せずにクラッシュさせてしまったことが昔ありました。そのときPlaygroundで挙動を確認したことがあったので、その結果を載せておきます。 nilの可能性を忘れてしまう変数 isEmpty…

SwiftにはByte型がないので戸惑うけれどUInt8がバイトやバイト配列を担っています

むかしむかしのSwiftにはByte型があったと思うのですが、あるとき突然廃止されました。Byte型の配列など使って低級の処理をしていたアプリやプログラムはコンパイルすらできない事態に。C#やJavaからやってきた人も一瞬戸惑うのではないでしょうか。どう調べ…

Swiftでバイト配列(UInt8配列)の変数どうしで論理演算XORを計算する方法

Swiftで[UInt8]のままXORをする必要がありました。しかしSwiftのXOR演算子は「^」であり、下記のように書いてもコンパイルエラーとなります。 let first: [UInt8] = [0xff, 0x10, 0xa0] let second: [UInt8] = [0x01, 0x02, 0x03] let result: [UInt8] = fir…

XcodeとSwiftでUILabelのテキストのハイパーリンク化は気軽にはできない

HTMLライクなデザインでテキストにハイパーリンクを付けることになりました。 各項目を入力して送信ボタンを押してください。何か分からないことがありましたら、こちらからお問い合わせください。 こんなケースですね。アンダーバーだけハイパーリンク化し…

SwiftでObjective-Cのポインタ型を書き換えるときのUnsafeMutablePointer<T>について

とあるSDKを使ってiOSアプリを開発しているのですが、いただいたSDKのドキュメントに書かれているサンプルコードがObjective-Cでした。僕はObjective-Cは嫌いなのでSwiftに書き換えます。するとこんな関数がありました。 (id)method:(int*)arg; Int型のポイ…

SwiftでiOSアプリのファイルシステムのディレクトリの存在チェックを行う

iOSアプリのDocumentsディレクトリにログを出力しようと思い、Logディレクトリを作成しました。当然このディレクトリはアプリが初めて起動したときに作成され、以降はディレクトリ作成を行う必要はありません。でもSwiftでディレクトリの存在チェックって情…

Swift4でDateの日時を任意のフォーマットでStringで表示する

Swiftの日時を表示するのはDateクラスで簡単に実装できます。 // 2018/01/12 00:00:00 print(Date()) しかしFormatを指定するとなると結構行数を使ってしまうんですよね。 let format = DateFormatter() format.timeStyle = .short format.dateStyle = .shor…

Swift4で任意のDateの日時から日の始まりである0時0分のDateの日時を作る

iOSアプリ開発においてデータベースのデータから本日登録されたデータだけを取り出す必要があったのですが、そのためには今日の0時0分のDateを作らなければなりません。例えば.Net Frameworkでは下記のように作成することができます。 var now = DateTime.No…