[Swift 3.0] 関数の命名規則を見てみよう [じんわり移行するSwift 3.0]

2016.11.02

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

おばんです、『君の膵臓を食べたい』の住野よる先生の最新作、『また、同じ夢を見ていた』という小説を読んでじんわりと幸せな気持ちに浸っている田中です。
人の幸せと後悔と、良きも悪きももしかするとそうだったかもしれないという人生を見つめる良い作品でした、オススメです。

はじめに

さてXcode 8.2にて早くも対応打ち切り・余命宣告を受けたSwift 2.3でありますが、それは開発者がSwift 3.0に対応せざるをえないということを意味します。
とはいえ「Swift 3.0対応マジつらい...」という方のために!具体的な、小さなコード例からSwift 3.0を見ていく記事を書いていこうと思います。
今回はモデルクラスに用いられている関数のラベル名を見ていきます。

関数のラベル名の規則の変更についてはこちらの記事でも取り扱っているので、ご覧になってみて下さい。
- [Swift 3.0] 関数ラベルのルールが変更になった話 | Developers.IO

TwitterのTimelineを表すモデルクラス

Swift 2.2の場合

以下はTwitterクライアントアプリで用いているTimelineを表すモデルクラスをSwift 2.2で書いた例になります。
TimelineはTweetの集合を表すものなのでitemsプロパティとしてTweetの集合を持っており、そのTweetのデータモデルであるstructに対してお気に入りに加える機能などを持っています。
参照の事故を防ぐを防ぐために参照を取り回すのではなくstructを再生成してその再生成したものを取り回すアクセントも効かせています。(insert, delete, favoriteがTimelineを返す作りであることを指しています)

import Foundation

struct Timeline: DataType {
    
    typealias ItemType = Tweet
    
    private var items: [ItemType] = []
    
    init(items: [ItemType]) {
        
        self.items = items
        
    }
    
    subscript(index: Int) -> Tweet {
        
        return items[index]
        
    }
    
    func insertItemAtIndex(item: ItemType, index: Int) -> Timeline {
        
        var mutableTweets = items
        mutableTweets.insert(item, at: index)
        return Timeline(items: mutableTweets)
        
    }
    
    func deleteItemAtIndex(index: Int) -> Timeline {
        
        var mutableTweets = items
        mutableTweets.remove(at: index)
        return Timeline(items: mutableTweets)
        
    }
    
    func favoriteTweetAtIndex(index: Int) -> Timeline {
        
        let cacheTweet = items[index]
        
        let tweet = Tweet(
            id: cacheTweet.id,
            text: cacheTweet.text,
            favorited: !cacheTweet.favorited,
            retweeted: cacheTweet.retweeted,
            user: cacheTweet.user)
        
        return deleteItemAtIndex(index).insertItemAtIndex(tweet, index: index)
        
    }
    
}

Swift 3.0の場合

これをSwift 3.0で書くとこんな風になります。

import Foundation

struct Timeline: DataType {
    
    typealias ItemType = Tweet
    
    private var items: [ItemType] = []
    
    init(items: [ItemType]) {
        
        self.items = items
        
    }
    
    subscript(index: Int) -> Tweet {
        
        return items[index]
        
    }
    
    func insert(item: ItemType, at index: Int) -> Timeline {
        
        var mutableTweets = items
        mutableTweets.insert(item, at: index)
        return Timeline(items: mutableTweets)
        
    }
    
    func delete(at index: Int) -> Timeline {
        
        var mutableTweets = items
        mutableTweets.remove(at: index)
        return Timeline(items: mutableTweets)
        
    }
    
    func favorite(at index: Int) -> Timeline {
        
        let cacheTweet = items[index]
        
        let tweet = Tweet(
            id: cacheTweet.id,
            text: cacheTweet.text,
            favorited: !cacheTweet.favorited,
            retweeted: cacheTweet.retweeted,
            user: cacheTweet.user)
        
        return delete(at: index).insert(item: tweet, at: index)
        
    }
    
}

変更点

Swift 2.2で書いた関数を見てみます。

func insertItemAtIndex(item: ItemType, index: Int) -> Timeline

なにを(Item)・どこに(AtIndex)・どうする(insert)という情報がメソッド名に含められており、さらに引数のラベル名にも書かれています。(item: ItemType, index: Int)
改めて見てみると冗長すぎるなという感じがします。


Swift 3.0で書いた関数を見てみます。

func insert(item: ItemType, at index: Int) -> Timeline

なにを(item: ItemType)・どこに(at index: Int)・どうする(insert)がすっきりとまとめられています。
Swift 3.0ではより自然言語としての英語に近い命名をすることを推奨しているようです。

まとめ

これまでCocoaの命名規則がとても長い名前だったのでそれに則った書き方がスタンダードになっていたように思いますが、
いかに情報を過不足なく伝えるために名前を考えるかがこれからのSwiftを書く上でより重要な課題になってきそうです。

また、「この書き方イケてねぇ!」とかあればブログのコメントやTwitterでご指摘いただければ、もれなく僕のコードがより良くなります。
よろしくお願いしまっす!!

参考