SwiftエンジニアのためのDartのFunctionの任意引数

kitoko552.hatenablog.com これのおまけ。Swiftエンジニア向け版です。 Swiftでの任意引数 Swiftではメソッドの引数を任意にしたい場合はデフォルト値を設定する。 // Swift fun hoge(isFuga: Bool = false) { // } hoge() // hoge(isFuga: false)と同義 Dar…

SwiftエンジニアのためのDart変数定義解説(var/final/const)

kitoko552.hatenablog.com この記事のおまけ。Swift書いてる人向けの別バージョン。 自分がiOSエンジニアでずっとSwiftを書いていた人間だったので、同じような人にわかりやすく説明できたらなという記事です。 雰囲気だけ伝わればと思っているので、細かい…

Haptic Feedbackを実装する

Haptic Feedbackとは ユーザーの何かしらのアクションに対して「ドゥッ」とiPhoneをバイブさせるアレ。 スタートトゥデイさんの記事の説明を拝借すると、 iPhone 6s 以降に搭載された Taptic Engineというハードウェアによる振動で、ユーザーのアクションに…

UICollectionView(UITableView)でpull to refreshを実装する

pull to refreshとは UICollectionViewやUITableViewを下に引っ張ってrefreshするあれ。 Twitterやinstagram等フィード型のアプリでよく使われている。 実装方法 iOS 10からUIScrollViewにrefreshControlというプロパティが使える。 @available(iOS 10.0, *)…

Elementが非OptionalのObservableでエラー時にnextを流す

解決したい課題 Elementが非OptionalのObservableでエラーを無視したい時がある。 Observableはエラーが流れてきたらcompleted状態になりもう二度とnextで値が流れてくることがなくなってしまうため、大抵無視したい時はcatchError(_:)やcatchErrorJustRetur…

AVPlayerの再生ステータス(playing/pause/end)を取得する

play or pause 再生中かどうかの判定にはAVPlayer.rateとAVPlayer.errorを使う。 var isPlaying: Bool { return player.rate != 0 && player.error == nil } end 再生が終わったかどうかの判定には、NotificationCenterにAVPlayerItemDidPlayToEndTimeのobse…

radiusが入った三角形のCGPathを作る

rect(四角形)であればUIBezierPathを使えば簡単に生成できる。 三角形の場合はCGMutablePathを使って生成する(三角形でなく他の多角形でも可能)。 下は右向きの三角形のpathを作る例。 // 各頂点を定義 let top = CGPoint(x: 22, y: 18) let right = CGP…

CAShapeLayer.pathに複数のUIBezierPathを指定する

UIBezierPathのappend(_:)を使う。 let leftRect = CGRect(origin: leftOrigin, size: size) let originalPath = UIBezierPath(roundedRect: leftRect, cornerRadius: 1) let rightRect = leftRect.offsetBy(dx: 12, dy: 0) let rightPath = UIBezierPath(ro…

UISliderのカスタマイズ

thumb(丸いやつ)はsetThumbImage(_:for)、thumbより左のプログレスはsetMinimumTrackImage(_:for)、thumbより右のプログレスはsetMaximumTrackImage(_:for)でそれぞれカスタマイズできる。 let thumbImage = UIColor.white.circleImage(width: 16, height:…

UIColorからUIImageに変換する

個人的には以下のようなメソッドをUIColorのextensionとして宣言している。 extension UIColor { /// 四角 func rectImage(width: CGFloat, height: CGFloat) -> UIImage { let rect = CGRect(x: 0, y: 0, width: width, height: height) UIGraphicsBeginIma…

observeValue(forKeyPath:of:change:context:)を使わないKVO

KVOでお馴染みのobserveValue(forKeyPath:of:change:context:)がSwift 3.2以降からdeprecatedになるらしい。 上記をoverrideして定義すると、 Block Based KVO Violation: Prefer the new block based KVO API with keypaths when using Swift 3.2 or later.…

HLSのm3u8ファイルからスナップショットを取得する

iOSでAVPlayer/HLSでストリーミング再生をしているときに、再生時間ごとのスナップショットを取りたいということがあった。 一番例としてピンとくるのは、動画のseek中のスナップショットでしょうか。 色々試行錯誤した結果以下で取得できた。 let asset = A…

Swiftで処理を遅延実行

何か処理を遅延実行させたい時はDispatchQueueのasyncAfter(deadline:execute:)を使う。 DispatchQueue.main.asyncAfter(deadline: .now() + 3, execute: { // 3秒後に実行 }) 実行内容にアニメーションが付随する場合はUIView.animte(animateWithDuration:d…

SKStoreReviewControllerを実装する

import StoreKit SKStoreReviewController.requestReview() 以上。超簡単。 SKStoreReviewControllerはiOS 10.3以上のみ対応なので、10.3未満の対応は別途必要。 実装するメリットは、ユーザーがApp Storeに行かなくてもアプリ内でレビューできる点。 ユーザ…

selectedBackgroundViewを使ってUICollectionViewCellの選択時の色を変える

UICollectionViewCellの場合はselectedBackgroundViewはcontentViewの背後にあるので、contentView.backgroundColorを指定した状態でselectedBackgroundViewを設定しても変化が見えない。 class AnyCell: UICollectionViewCell { override func awakeFromNib…

UICollectionViewでセル数が少ないときにスクロールできない

全コンテンツ(セル)が画面に収まる程度の場合、UICollectionViewはスクロールができなくなる。 スクロール方向が縦の場合はalwaysBounceVertical、横の場合はalwaysBounceHorizontalをtrueにすることでスクロールできるようになる。 collectionView.always…

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…