kitoko552.memo

kitoko552のメモ

Swift

Swift 3におけるアクセス修飾子

要点 open: 外部モジュールからアクセスでき、外部モジュールで継承・オーバーライドができる(Swift 3未満のpublicと同義)。 public: 外部モジュールからアクセスできるが、外部モジュールで継承・オーバーライド等はできない。 internal: 同じモジュール…

Swift 3のstructがプロパティに合わせて自動で作るイニシャライザはinternalになる

要点 Swift 3では、structがプロパティに合わせて自動で作るイニシャライザは、プロパティのアクセスレベルにかかわらずinternalになる。 ライブラリを公開している方は注意。 外部からも使えるようにするにはpublicなイニシャライザを改めて定義してやる。 …

AlamofireのSwift 3対応バージョンをiOS 8対応のプロジェクトでも使えるようにする

要点 AlamofireのSwift 3対応バージョンである4.0.0は対応OSがiOS 9以上 iOS 8でも使いたい場合は、フォークしてURLSessionStreamTaskを使っている部分をコメントアウトすると使える Swift 3登場 先日正式版のiOS 10, Xcode 8がリリースされ、既存のアプリを…

lazyを使って他のプロパティを使うプロパティの初期化を宣言時に実現する

要点 lazy を使えば他のプロパティを必要とするプロパティの初期化を宣言時にすることができる。 その場合は型宣言を書かなければエラーが出るので注意する。 他のプロパティにはselfを書かないとエラーが出る。 private lazy var hakuba: Hakuba = Hakuba(t…

【Swift】文字列の頭文字を取り除く

String(text.characters.dropFirst()) こんな時に使う let user = "@tanaka" let name = String(text.characters.dropFirst()) print(name) // tanaka

Dictionaryの配列をひとつのDictionaryにする

要点 Dictionaryの配列をflatMapすると reduceを使う reduceについて 要点 Dictionaryの配列をひとつのDictionaryにするにはreduceを使う。 let array = [["one" : 1], ["two" : 2], ["three" : 3]] let dictionary = array.flatMap { $0 }.reduce([String :…

componentsSeparatedByStringで文字列から配列を生成する

要点 文字列から配列を作りたい 配列から文字列を作りたい場合は 要点 SwiftでStringから配列を生成する場合はcomponentsSeparatedByString(_ separator: String) -> [String]を使う。 let string = "hoge,fuga,popi" let array = string.componentsSeparate…

joinWithSeparatorで配列内の文字列を結合する

要点 配列内の文字列を結合したい joinWithSeparatorを使う ちなみに 要点 joinWithSeparator(_ separator: String) -> Stringを使う。 let array = ["h", "o", "g", "e"] let hoge = array.joinWithSeparator("-") print(hoge) // h-o-g-e 配列内の文字列を…

UIViewControllerAnimatedTransitioningを使って自作の画面遷移を実装する【基本編】

要点 iOSアプリの画面遷移 自作の画面遷移を実装する方法 UIViewControllerAnimatedTransitioningに準拠したクラスの実装 transitionDurationメソッド animateTransitionメソッド 1つ目のまとめ UIViewControllerTransitioningDelegateのメソッドの実装 anim…

Swiftで端末のディレクトリ一覧を表示する

要点 ディレクトリの一覧を表示したい contentsOfDirectoryAtPathを使う場合 subpathsAtPathを使えばもっと簡単 enumeratorAtPathというのもある 要点 NSFileManagerを使って探索する。 使えるのはcontentsOfDirectoryAtPath(path: String) -> [String]?, su…

UICollectionViewやUITableViewのスクロール処理はViewが描画されてから行う

要点 UICollectionView, UITableViewのスクロール処理 setContentOffsetかscrollToItemAtIndexPathを使う メソッドを呼ぶのはViewが描画されてから viewDidAppearかviewDidLayoutSubviews内で呼ぶ 要点 UICollectionView, UITableViewのスクロールはsetConte…

SwiftでStringからIntやCGFloatに変換するときの話

要点 Stringから数値に変換する際はNSNumberFormatter().numberFromString(string)がおすすめ Intにはイニシャライザを使って変換する方法もあるが、CGFloatにはStringを引数に取るイニシャライザがない let intStr = "3" let intNum = NSNumberFormatter().…

Stringのlength(文字数)を取得するにはcharacters.countがベスト

要点 Stringの文字数を取得する方法はけっこうある。 characters.countが一番正確っぽい。 print(str.characters.count) print(str.utf16.count) print(str.lengthOfBytesUsingEncoding(NSUnicodeStringEncoding)) swift string lengthとググると... いろい…

iOS9でWKWebViewのdecelerationRateの設定がうまくいかないときの対処法

要点 iOS9でWKWebViewのdecelerationRateの設定がうまくいかないのはiOSのバグ。 対処法としては、WKWebViewのscrollViewのdelegateを指定し、scrollViewWillBeginDraggingでdecelerationRateを設定する。 class HogeViewController: UIViewController { var…

Objective-CからSwiftのenumを使う

要点 enumの宣言の前に@objcをつける。 enumはIntとして宣言する必要がある。 IntでないenumはObjective-Cからは使えない。 // 使えない enum Hoge: String { case hoge ... } // 使える @objc enum Hoge: Int { case hoge ... } Swiftのenum Swiftではenum…

Objective-CからSwiftのstruct(構造体)は使えない

要点 Objective-Cで使えるオブジェクトは全てNSObjectを継承しているため、NSObjectを継承できないSwiftのstruct(構造体)は使えない。 クラスも同様、NSObjectを継承していないクラスはObjective-Cからは使えない。 まだObjective-C書いてるの? そう思う…

Arrayは値型でNSArrayは参照型

要点 Arrayは値型でNSArrayは参照型ですよって話です。 変数の再代入やメソッドの引数に渡す際、Arrayの場合はコピーが渡され、NSArrayの場合は参照が渡される。 Arrayでもinoutを使えば参照渡しができる。 SwiftのArrayは値型 SwiftのArrayは値型です。 Arr…

まだfor文で消耗してるの? map, filter, flatMapを使えばfor文は要りません

要点 Swiftではmap, filter, flatMap, forEachを使えばfor文は必要ありません。 mapの例 let numbers: [Int] = [1, 2, 3] // for文 var twice = [Int]() for num in numbers { twice.append(num * 2) } // map let twice = numbers.map { $0 * 2 } // twice …

forEachを使ってSwiftっぽく書く

要点 SwiftのforEachを使えば、普通のfor文よりもSwiftっぽく書けます。 ただし、配列などのコレクションの中身を変更するようなものはforEachじゃなくてmapとかfilterとかflatMap使いましょう。 // for文 for element in array { if element == 2 { // Do s…

PhotoKitでアルバムを新規作成する

要点 PHPhotoLibraryのperformChangesメソッドでアルバムを作成できる。 performChangeメソッドのchangeBlockにアルバム新規作成のChangeRequestを書くことで作成する。 import Photos let changeBlock: () -> Void = { PHAssetCollectionChangeRequest.crea…

Swiftの配列をNSMutableArrayに変換する

要点 Swiftの配列をNSMutableArrayに変換するには、NSMutableArray(array:)を使います。 前提 Objective-C時代に活躍したNSArrayやNSMutableArrayは、Swiftではほぼ使いません。 しかし、コードがObjective-CとSwiftの共存であるプロジェクトでは、SwiftでNS…

SwiftでrespondToSelectorを呼ぶ必要はない

要点 SwiftにはOptional ChainingがあるのでrespondToSelectorを呼んでチェックする必要はありません。 シンプルにhoge.delegate?.delegateMethod()と書くだけでいいです。 delegateを使った実装 Objective-C時代は、delegateを使ってある処理を他のクラスに…

【Swift】配列の要素をfunctionalに削除する

簡潔にまとめると 削除したい要素を取り除くのではなく、削除したい要素以外を再代入すればいい。 array = array.filter { $0.index != num } もうちょい詳しく Swiftは配列等の集合(SequenceTypeプロトコルを適応したもの)はmapやfilter等を使ってfunctio…

SwiftのクラスをObjective-Cで使う

要約 Objective-Cファイル内で${ProductModuleName}-Swift.hをimportする Swift側のファイルはNSObjectを継承していなければコンパイルエラーになる 詳細 kitoko552.hatenablog.com この記事の反対のことをやろうということです。 SwiftのクラスをObjective-…

Objective-CのクラスをSwiftで使う

要約 ${ProductModuleName}-Bridging-Header.h で該当のObjective-Cファイルをimportする だけです。 詳細 Bridging Headerの作成・設定方法は以下のリンクを読めば大体わかります。 tech.admax.ninja 作成・設定が完了したらBridging Headerファイルに、 //…

SwiftGenでリソースをタイプセーフに扱う

概要 SwiftGenを使えばLocalizable.strings, Storyboard, ImageAssetsなどのリソースをenum化してタイプセーフに書けるよって話です。 github.com SwiftでStringを扱うときの問題点 SwiftでStringを普通に扱うと以下のようになります。 let title = "What th…

Quick Actions (3D Touch Shortcuts)を実装する

iPhone6sから3D touchが導入されました。 ホーム画面のアプリアイコンを3D touchすることで、目的の操作画面でアプリを起動する操作をQuick Actions(または3D Touch Shortcuts)と言います。 この記事では、このQuick Actionsの実装方法や注意事項などを簡…

Swift2.0にtry?を使ってスマートにError Handlingをする

Swift2.0でError Handlingの機能が追加されました。 しかしError Handlingを行うと、ネストが増えたり、一度varで宣言してからdo catchを書いたりと、コードがスマートに書けませんでした。 var audioInput: AVCaptureInput? do { audioInput = try AVCaptur…

Swift2.0でavailableを使ってバージョンチェックをする

Swift2.0からavailableを使ってバージョンチェックができるようになりました。 if #available(iOS 8.0, *) { // iOS8.0以上の場合のみの処理 } 構文は上のように、#abailable(platform version, ...)となります。 末尾の*は、「他のプラットフォームに関して…

Swiftでnil < 数値はtrueになる

Swiftではnilと数値を比較する際、nil < 数値はtrueになります。 let num: Int? = nil if num < 300 { print("true") // numがnilでも通る。 } この問題は特にOptional bindingする際に気をつけるべきです。 Optional bindingをすると、あるoptional型の変数…