DartにおけるErrorとExceptionの使い分け

Error vs. Exception in Dart - Stack Overflow より。 Error and its subclasses are for programmatic errors. If one of those occurs, your code is bad and you should fix your code. Non-Error exception classes are for runtime errors. Sometimes …

Flutterで画像にborder radiusをつける

結論 ClipRRectを使ってchildにImageのWidgetを置く。 やりたいこと FadeInImageにborder radiusをつけたい。 問題 Containerのdecorationにborder radiusを指定しても効かない。 Container( width: 100.0, decoration: BoxDecoration( borderRadius: Border…

Dartで改行なしのprint

stdout.write(); を使う。 import 'dart:io'; を忘れずに。 Reference stackoverflow.com

VSCodeでdartfmtを保存時に実行するようにする

VSCodeの環境設定からdartのsettings.jsonに移動して下記を追加する。 "editor.formatOnSave": true Source github.com

やっぱやめた

二転三転すみません。 こちら撤回します。 kitoko552.hatenablog.com github.ioだと管理が面倒で。。 引き続きこちらでQiitaに書くほどでもないけど自分用も含めてメモっておきたいプログラミング関連の小ネタを書いていきます。

ブログお引っ越し

こちらのブログはもう更新しないので新しいブログをよろしくお願いします。 https://kitoko552.github.io/ 追記 やっぱ引越しやめました。。 kitoko552.hatenablog.com

Flutterで端末のOSを判定する

Flutterで端末のOSを判定するには、dart.ioにあるPlatformクラスを使う。 import 'dart:io' show Platform; if (Platform.isIOS) { // iOSなら } if (Platform.isAndroid) { // Androidなら } 他にもisWindows, isFuchsia, isLinux, isMacOSがある。 ちなみ…

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

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

DartのFunctionで任意の引数をとる2種類の方法

はじめに 公式のLanguage Tourを読んだ方が正確です。特にOptional parameters章を。 この記事は日本語かつ自分の言葉で残したいが故の記事です。 DartのFunctionの基本 Dartでは普通にFunctionを定義するとその引数は必須になる。 String say(String from, …

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

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

Dartの変数宣言(var/final/const)の違い

はじめに 当たり前ですが、基本公式のLanguage Tourを読む方が正確。 この記事はLanguate Tour + αを日本語かつ自分の言葉でまとめたものです。 var varは代入が何回でも可能な変数を定義する時に使う。 var name = 'apple'; name = 'google'; print(name); …

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.…

YouTube動画のm3u8URLを取得する

https://www.youtube.com/get_video_info?video_id={videoId} 上記URLのvideo_idパラーメタに該当するYouTube動画のvideoIDを与えると、以下のような{key}={value}&が連続する形でレスポンスが返ってくる hl=ja_JP&timestamp=1520407725&... この中にhlsvpと…

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…

ModalのWebViewでFileReaderを使うとViewControllerごとdismissされる

iOS

FileReaderとは developer.mozilla.org Webページ内でハードウェアのファイルにアクセスするやつ。 iOSの場合これ。 ViewControllerごとdismissされる これをModalで開いたViewController内WebViewで使うと、アクション選択時やキャンセル時にViewController…

コマンドラインでMacのスペックを調べる

$ system_profiler SPHardwareDataType Hardware: Hardware Overview: Model Name: MacBook Pro Model Identifier: MacBookPro11,5 Processor Name: Intel Core i7 Processor Speed: 2.5 GHz Number of Processors: 1 Total Number of Cores: 4 L2 Cache (pe…

gitのcommitのauthorを変更する

git

kitoko552.hatenablog.com gitでリポジトリごとにユーザー(author)を変える方法については上記の記事で書きましたが、すでにcommitしてしまっていて後からauthorを変更したい場合は以下のコマンドを実行します。 git commit --amend --author="ユーザー名 …

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

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