Swiftで型推論を使っていきたい

省略について

Swiftには型名.varibaleHogeと書くところを型がわかっている場合は.varibaleHogeと書ける。
例えば以下のような感じ。

// textAlignmentはNSTextAlignment(enum)で、centerが定義されている
UILabel().textAlignment = .center
// centerはCGPointで、zeroがstatic varで定義されている
UILabel().center = .zero

型推論を使えるようにする

上の例ではenumstatic varで既に定義してあるものを省略して書いている。これを自分たちで定義することで便利に呼び出すことが出来る。
例えばアプリで使う色が決まっている場合は以下のようにできる。

// MARK: - App color scheme
extension UIColor {
    /// #FFFA89
    static let yellowBackground = #colorLiteral(red: 1, green: 0.9803921569, blue: 0.537254902, alpha: 1)
    /// #A66BFF
    static let purpleButton = #colorLiteral(red: 0.6509803922, green: 0.4196078431, blue: 1, alpha: 1)
    /// #FF1A1B
    static let redError = #colorLiteral(red: 1, green: 0.1019607843, blue: 0.1058823529, alpha: 1)
}

// static letで定義したので省略して書ける
// また直接カラーリテラルを代入するのと違い、変数名で色の役割がわかる
UILabel().backgroundColor = .yellowBackground
UILabel().textColor = .redError

また自分が先日使えると思ったのを書いてみる。NotificationCenterで独自に通知名を指定し、処理する例である。通常であれば下のように書くと思う。.init("appHogeEvent")で独自の通知名を指定しているが、"appHogeEvent"でタイポしてしまうと処理されなくなってしまう。

NotificationCenter.default.post(name: .init("appHogeEvent"), object: nil)

これをenumstatic letを使うことで以下のように書ける。

enum AppNotificationName: String {
    case hogeEvent
}

// MARK: - App custom notification
extension Notification.Name {

    // AppNotificationNameを使ってイニシャライズできるようにする
    init(appNotificationName: AppNotificationName) {
        self.init(appNotificationName.rawValue)
    }

    static let appHogeEvent = Notification.Name(appNotificationName: .hogeEvent)
}

// static letで定義したappHogeEventを型推論を書く
NotificationCenter.default.post(name: .appHogeEvent, object: nil)

まとめ

自分でextensionを使って拡張することで便利に型推論を使うことが出来る。タイプ数を減らすだけでなく、変数名で役割を明確にしタイポも減らすことが出来るので使っていきたいという話。