NSBlogger

意識高いブログ

SwiftでStoryboardとXibをシンプルに呼び出す

StoryboardとXibの呼び出し方が面倒

コードからStoryboardやXibを呼びだそうとすると以下のような煩わしい書き方になります。

// load view from xib
let sampleView = UINib(nibName: "SampleView", bundle: nil).instantiateWithOwner(self, options: nil)[0] as! SampleView

// load view controlelr from storyboard
let storyboard = UIStoryboard(name: "Sample", bundle: nil)
let sampleViewController = storyboard.instantiateViewControllerWithIdentifier("SampleViewController") as! SampleViewController

まず何が煩わしいかというと、長ったらしくて覚えてられんということ。そしてas!で強制アンラップしているので、Swift的にあまりよろしくありません。as?にしてif let, guard let elseで書くのもありですが、毎回書くのは面倒です。

続きを読む

SwiftでNSDateを直感的に比較する

NSDateの比較

下記のようにしてNSDateの比較ができます。

d1.compare(d2) == .OrderedDescending

compareというメソッドを使い、その結果が.OrderedSame、.OrderedDescending、.OrderedAscendingのどれに一致しているかを見て判断。いまいち直感的でない比較でよく混乱します。

<, >, == で比較できるようにする

下記のように「<」「>」「==」を拡張すると、直感的に比較ができるようになります。

func == (d1:NSDate, d2:NSDate) -> Bool {
    return d1.compare(d2) == .OrderedSame
}

func > (d1:NSDate, d2:NSDate) -> Bool {
    return d1.compare(d2) == .OrderedDescending
}

func < (d1:NSDate, d2:NSDate) -> Bool {
    return d1.compare(d2) == .OrderedAscending
}

func <= (d1:NSDate, d2:NSDate) -> Bool {
    return d1 < d2 || d1 == d2
}

func >= (d1:NSDate, d2:NSDate) -> Bool {
    return d1 > d2 || d1 == d2
}

使い方はこんなかんじ。

let now = NSDate()
let tomorrow = NSDate(timeIntervalSinceNow: 60 * 60 * 24)
let yesterday = NSDate(timeIntervalSinceNow: -60 * 60 * 24)

if now < tomorrow {
    print(true)
}

if yesterday <= now {
    print(true)
}

普通の文字列比較のように、右辺と左辺にNSDateのオブジェクトを指定してやればOK。ぱっと見ただけでどういう条件かも分かりやすくて便利かと。

iOSアプリ開発に役立つWebサービス&ツールまとめ

はじめに

iOSアプリ開発をしていて役立つWebサービスやツールがありますので備忘録としてまとめてみました。アプリ開発を始めるところからリリース後までを順番に書き並べています。ぜひiOSアプリ開発をしている方は参考にしてください。(Androidアプリ開発している方にも使えるものはあると思います。)

続きを読む

UIScrollView.contentOffsetの謎

UIScrollView.contentOffset

UIKitに含まれるUIScrollViewのプロパティ「contentOffset」。

public class UIScrollView : UIView, NSCoding {
        public var contentOffset: CGPoint // default CGPointZero

contentOffsetはどれだけスクロールしたかを表します。型はCGPoint。

contentOffsetの値はまるめられる

もしかしたら常識なのかもしれないですが、最近デバッグしてて気付きました。結論は、contentOffsetの値はまるめられるということ。
contentOffsetは1.0ずつ更新されます。ただし、addSubViewされていると0.5ずつ更新されます。

続きを読む

iOSアプリ開発におけるイースターエッグのすすめ

はじめに

この記事はiOS Advent Calendar 2015 - Qiita 19日目の記事です。
昨日はhachinobuさんのMVVMっぽい構成のデモアプリを公開してみるでした。
本日はイースターエッグについて。
イースターエッグとは簡単にいうと隠し機能のことです。余裕のある開発者が仕込んだ粋なお遊びですね。
発見したときはついつい友達に教えたくなります。イースターエッグが仕込まれているアプリおよび実装例について紹介しますね。

続きを読む

iOS9対応でやろうと思っていることまとめ

iOS9がそろそろでます

iOS9が今月半ばに登場するので、それに向けてiOS9対応をする必要があります。
例年の通りだと、来年にはiOS9SDKでビルドしていないものは審査すら出せなくなります。
iOS8対応済みのアプリに対してiOS9対応する際にやろうと思っていることを以下にまとめました。
他にもこれやっといたほうがいいよっていうのがあれば教えて下さい。

続きを読む

iOSアプリの64bit対応でやったことまとめ

2015年06月より64bit対応必須に

そういえば今月から64bit対応が必須になりました。アプリ申請時に64bit対応していないと自動的にはじかれます。64bit対応なんてすぐ終わるやーと思っていたんですが、なんだかんだ2週間くらいかかってしまいました…。やったことをまとめます。

続きを読む