Xcode
Swift

もっとSwiftのリテラルを活用しよう!!

皆さんこんにちは、最近Swiftでのリテラルの扱いが面白いな〜
と思って使っていたので、周知できればと思い記事にしてみました。

そもそもリテラルとは

リテラルとは英語で"文字どうり"という意味の言葉です。
ソースコード内に値を直接表記したものを言います。

例えばこんな

let str = "hoge_hoge" // これはStringを生成するリテラル

let int = 1000 // これはIntを生成するリテラル

let double = 3.141 // これはDoubleを生成するリテラル

let array = [1, 23, 67] // これはArray<Int>を生成するリテラル

こんな感じで高級言語と言われるものには大概リテラルが存在します。
SwiftだとImageリテラルやColorリテラルなんてのもありますね。

スクリーンショット 1.png

便利なリテラルですが、コンパイラとの繋がりが強いので多くの言語では
プログラマがどうこうできるものではないことが多いです。

Swiftのリテラル !

Swiftは便利なことにリテラルによるイニシャライザを提供しています !
例えば標準ライブラリのIndexPathは実は配列リテラルから生成するとこが可能です。

tableView.scrollToRow(at: [0, 0], at: .top, animated: true)
//↕︎ 同値
tableView.scrollToRow(at: IndexPath(row: 0, section: 0), at: .top, animated: true)

こんな感じにリテラルを使うことによって、簡潔に表記することができます。

もっと便利に !

当然リテラルからのイニシャライズは自分で実装することも可能です。
試しにCGPointを配列からイニシャライズできるようにしてみましょう。

extension CGPoint: ExpressibleByArrayLiteral{
    public typealias ArrayLiteralElement = CGFloat

    public init(arrayLiteral elements: CGPoint.ArrayLiteralElement...) {
        self.init(x: elements[0], y: elements[1])
    }
}

これだけです。
ねっ?、簡単でしょう?

これでCGPointをリテラルから生成できるようになりました。

someView.frame.origin = [100, 100]
//↕︎ 同値
someView.frame.origin = CGPoint(x: 100, y: 100)

型予測が効くので[100, 100]CGPointだと認識してくれます。

最後に

いかがでしたでしょうか?
Swiftの素晴らしさが少しでも伝わってくれればと思います。

デワデワ...

おまけ

(私はCSSとかの色表現に慣れているのでこんなこともやってます。)

someView.backgroundColor = 0xff0000
//↕︎ 同値
someView.backgroundColor = .red

本当にデワデワ