swift

A collection of 11 posts
Swift(iOSアプリ)でprintと debugPrintとNSLog
swift

Swift(iOSアプリ)でprintと debugPrintとNSLog

iOSアプリを作っているときログ出力をするならprint|debugPrint|NSLogいずれかを使うけど、Releaseビルドではどれが出力されるのか確認したことが無かったので確認をした。 Objective-CでiOSアプリを作っているときNSLogの出力はReleaseビルドでもログ出力されることは確認していたのでよくあるifdefマクロで LOG(...) のようにしていた。 実装 実装はXcodeでFile > New > Project... > AppでSwiftを使ったアプリ作成 ViewController.swiftの viewDidLoad() に下記を追記 print(">>> this is test message from print") print(">>> this is test message from debugPrint") NSLog(">>> this is
2 min read
ios

iOS13のFontFamilyName

* iOS8系でフォントの一覧 * iOS9系でフォントの一覧 * iOS10系でフォントの一覧 * iOS11系でフォントの一覧 * iOS12系でフォントの一覧 * iOS13系でフォントの一覧 取得方法 familyNameからfontNameを取得する。前回かより少し変更しました。 UIFont.familyNames .sorted { $0.compare($1) == .orderedAscending } .flatMap { UIFont.fontNames(forFamilyName: $0).sorted { $0.compare($1) == .orderedAscending } } .forEach { print($0) } 確認環境 iPhone 11 Pro Simulator (iOS13.3) 結果抜粋 AcademyEngravedLetPlain AlNile AlNile-Bold AmericanTypewriter AmericanTypewriter-Bold Am
2 min read
ObjCのXcodeプロジェクトをSwiftのプロジェクトに変更する
xcode

ObjCのXcodeプロジェクトをSwiftのプロジェクトに変更する

Objective-Cで作成されているプロジェクトをSwift混在プロジェクトに作り替えようという話があった。 XcodeのテンプレートプロジェクトではObjective-CとSwiftどちらの言語を選べるけど、言語が変わる以上に何が変わるのかというかどこが言語選択のキモになるかを調べたので需要は無いだろうけど、Objective-CベースのプロジェクトをSwiftベースのプロジェクトに作り替えた作業のログを書く。 日本語がおかしかったので編集したらもっと日本語がおかしくなった。 なんでSwift混在にしたいのか 最近は主にSwiftで開発を行っていて、サードパーティーのライブラリもSwiftのものを利用しているから。 Objective-C製のライブラリをSwiftで使うときは割とどうとでもなるけど、Swift製のライブラリをObjective-Cで使うときはライブラリが内部クラスなのか public なクラスなのか設定が必要とかそういうのがあったはず。 そのため新規開発する部分はSwiftで、外部ライブラリを使用したいObjective-Cの実装もSwiftでex
2 min read
ios10

iOS10のFontFamilyName

旧OS * iOS8系でフォントの一覧 * iOS9系でフォントの一覧 * iOS10系でフォントの一覧 * iOS11系でフォントの一覧 * iOS12系でフォントの一覧 * iOS13系でフォントの一覧 iOS10でフォント一覧を書き出すの忘れていた。 Swift3での取得方法が気に入らなかったので修正。ObjCとそーとのロジックが異なるけどもう不要かなって気もする。 取得方法 familyNameからfontNameを取得する。今回からソートするようにした。 //////////// // Objc NSMutableArray<NSString*> *array = [NSMutableArray array]; for (NSString *familyName in [UIFont familyNames]) { for (NSString *fontName in [UIFont fontNamesForFamilyName:familyName]) { [array addObject:fontName];
2 min read
objc

Date型の比較@ObjC/Swift

Date型の比較をするとき、多くの場合は"2016-12-09"とか"2016-12-09 10:00:00+0900"とか、年月日か年月日と時分秒までの比較が多いのかなと思いますが。 Objective-C -[NSDate earlierDate:]と-[NSDate laterDate:]が使えるので、挙動を理解していればそれがラクかなと思いますが、可読性を考えると[NSDate compare:]で比較した方がわかりやすいときもあるかもしれない。 -[NSDate earlierDate:]と-[NSDate laterDate:]は自身とanotherDateの値が等しい場合には自身の値を返すことだけ覚えておく必要がある。(なのでログ出力ではポインタを吐いている NSDateFormatter *df = [[NSDateFormatter alloc] init]; df.locale = [NSLocale localeWithLocaleIdentifier:@"en_US_POSIX"
1 min read
ios

iOS開発初心者に知ってもらいたい開発スキル

この記事は画像がたくさんだったりしてすごく長いです。 SwiftでiOS開発の勉強をしている会社の新人と話をしているときに実装中のコードを見せてもらうと気になる実装があった。 let action = UIAlertAction(title: "title", style: .default, handler: { (action: UIAlertAction!) in ... }) UIAlertActionのイベントハンドラになるクロージャの引数の型が違う。 このイニシャライザのメソッド定義はこちら。 open class UIAlertAction : NSObject, NSCopying { public convenience init(title: String?, style: UIAlertActionStyle, handler: ((UIAlertAction) -> Swift.Void)? = nil) } handlerの引数クロージャの引数はUIAlertActionなのに、なぜかUIAlertAction!と書
6 min read
xcode8

Xcode8 UIViewController.view.subviewsのframeについて(追記しました)

ビューのサイズが1000x1000になる Xcode8からStoryboardやxibでオブジェクトがframe値を持たなくなった影響で、UIViewController.view.subviewsのビューが正常なサイズを取得できなくて困るという話をよく耳にしている。 こんな感じのやつ <UIView: 0x7ff823d04e80; frame = (0 0; 1000 1000); autoresize = RM+BM; layer = <CALayer: 0x61000003dca0>> 自分もこれで困ることはあったけど、まぁ仕方ないからラクしないで修正しようか。くらいの気持ちでした。 検証した まずは通常のライフサイクルを確認する。 UIViewControllerとUIViewを拡張してログ出力するようにした。 // UIViewControllerのログ print("\(Date().description) : \(type(of: self)).\(#function):\(#line)") // UIViewのログ pri
7 min read
ios

Swiftでアプリのバージョンチェック

アプリのバージョンチェックを実装するときは、特に何も考えず String.compare: メソッドを使えばいいじゃんと思っていたのですが、 String.compare: だけだと問題がありました。 結論 こんな感じで、 compare:options: で . NumericSearch を指定すればOKでした。 extension String { static func checkVersion(lhs lhs: String, rhs: String) { switch lhs.compare(rhs, options: .NumericSearch) { case .OrderedAscending: print("lhsの方がrhsよりも小さい") case .OrderedSame: print("lhsとrhsは等しい") case .OrderedDescending: print("lhsの方がrhsよりも大
1 min read
xcode

Swiftのコンパイルはストレスが溜まるので

SwiftでiOSアプリを作成しているとコンパイル速度が遅くてストレス溜まるなーというタイミングが多々あるのでコンパイル速度というかストレスを減らそうという対応を幾つか記載。 やったこと プロジェクトのコンパイル時間計測オプションを設定する Xcodeプロジェクトの Bundle Settings にある Swift Compiler - Custom Flags で -Xfrontend -debug-time-function-bodies を設定する BuildTimeAnalyzer を入れる BuildTimeAnalyzer プラグインをインストールする 現行バージョンではBuildTimeAnalyzerの更新中にビルドし直すとクラッシュするけど重いメソッドが見られるので便利。 InterfaceBuilderの自動コンパイルを止める StoryboardかXibファイルを開いてInterfaceBuilderが表示されているときに Automatically Refresh Views のチェックを外す。 Xcod
3 min read