Swiftで計算型プロパティをネストさせてみる

公開日: : iPhoneアプリ開発

20160513-010707.jpg

Swiftの計算型プロパティ(Computed property、コンピューテッドプロパティ)をネストできることを初めて知ったので、サンプルも交えて紹介したいと思います。

    

スポンサード リンク

単一の計算型プロパティを使って実装する

まず、単一の計算型プロパティを使ってサンプルを書いてみました。

struct Data1 {
    var count: Int
    var unit: String
    
    var attributedText: NSAttributedString {
        let result = NSMutableAttributedString()
        
        
        let countAttributes = [
            NSFontAttributeName : UIFont.systemFontOfSize(24),
            NSForegroundColorAttributeName : UIColor.redColor()
        ]
        let countText = NSAttributedString(string: String(count),
                                           attributes: countAttributes)
        result.appendAttributedString(countText)
        
        
        let unitAttributes = [
            NSFontAttributeName : UIFont.systemFontOfSize(14),
            NSForegroundColorAttributeName : UIColor.blackColor()
        ]
        let unitText = NSAttributedString(string: unit,
                                          attributes: unitAttributes)
        result.appendAttributedString(unitText)
        
        
        return result
    }
}

Data1(count: 27, unit: "inch").attributedText

赤い文字と黒い文字を組み合わせたNSAttributedStringを生成する計算型プロパティですが、コードが長く処理の流れが見通しづらくなってしまっています。

    

複数の計算型プロパティを使って実装する

次に、複数の計算型プロパティを使って実装してみましょう。

struct Data2 {
    var count: Int
    var unit: String
    
    private var countText: NSAttributedString {
        let countAttributes = [
            NSFontAttributeName : UIFont.systemFontOfSize(24),
            NSForegroundColorAttributeName : UIColor.redColor()
        ]
        return NSAttributedString(string: String(count),
                                  attributes: countAttributes)
    }

    private var unitText: NSAttributedString {
        let unitAttributes = [
            NSFontAttributeName : UIFont.systemFontOfSize(14),
            NSForegroundColorAttributeName : UIColor.blackColor()
        ]
        return NSAttributedString(string: unit,
                                  attributes: unitAttributes)
    }
    
    var attributedText: NSAttributedString {
        let result = NSMutableAttributedString()
        result.appendAttributedString(countText)
        result.appendAttributedString(unitText)
        return result
    }
}

Data2(count: 27, unit: "inch").attributedText

countTextとunitTextはprivateにしているので外部からは見えませんが、struct内の名前空間を汚してしまう点が微妙だと思います。

    

計算型プロパティをネストさせる

最後に計算型プロパティをネストさせて実装してみましょう。

func +(text1: NSAttributedString, text2: NSAttributedString) -> NSAttributedString{
    let result = NSMutableAttributedString()
    result.appendAttributedString(text1)
    result.appendAttributedString(text2)
    return result
}

struct Data3 {
    var count: Int
    var unit: String
    
    var attributedText: NSAttributedString {
        // Nested computed property 😊
        var countText: NSAttributedString {
            let countAttributes = [
                NSFontAttributeName : UIFont.systemFontOfSize(24),
                NSForegroundColorAttributeName : UIColor.redColor()
            ]
            return NSAttributedString(string: String(count),
                                      attributes: countAttributes)
        }
        
        // Nested computed property 😊
        var unitText: NSAttributedString {
            let unitAttributes = [
                NSFontAttributeName : UIFont.systemFontOfSize(14),
                NSForegroundColorAttributeName : UIColor.blackColor()
            ]
            return NSAttributedString(string: unit,
                                      attributes: unitAttributes)
        }
        
        return countText + unitText
    }
}

Data3(count: 27, unit: "inch").attributedText

計算型プロパティをネストさせたので、countTextやunitTextがstruct内の名前空間を汚さず、更にattributedText内でのみ使用するという意図も表現できています。

ついでにNSAttributedString同士を連結する+演算子を導入したことで、読みやすいスッキリとしたコードにすることができました。

    

サンプルはこちら

今回のサンプルコードはGitHubに置いてありますので、ぜひチェックしてみてください。 ⇒ SwiftTips/Contents.swift at master · akio0911/SwiftTips

    

@akio0911はこう思った。

今回紹介した「計算型プロパティのネスト」は応用範囲が広そうな書き方ですね。

これから書くコードで積極的に活用していきたいなと思ってます。

    

↓ Swiftの計算型プロパティなどに関する文法は、以下の本が詳しいです。

この記事が気に入ったら「いいね!」しよう

follow us in feedly

Feedlyで最新記事を購読

Twitterで更新情報をゲット!

LINEでご感想・ご要望お送りください!
(スマホでLINEを起動 > 友だち追加 > QRコード)

関連記事

20140810-193043.jpg

WordPressでObjective-Cのソースコードをキレイに整形して表示する方法

WordPressの記事内で、Objective-Cのソースコードをキレイに整形して表示する方法

記事を読む

I20160102-131507.jpg

Swift 2の文法が分かるオススメ本「詳解 Swift 改訂版」

Swift文法書の定番とも言える、荻原 剛志さんの「詳解 Swift」。 Swiftの文法をキ

記事を読む

I20160228-162014.jpg

詳解 Swift 改訂版のKindle版が発売。リフローに対応!

今日気付いたんですが、「詳解 Swift 改訂版」のKindle版がいつの間にか発売されていまし

記事を読む

20150409-103620.jpg

描いたベクターグラフィックをSwift/Objective-Cコードに変換できる「Paint Code 2」

引用元 : PaintCode ベクターグラフィックを描き、それを描画するためのSwift

記事を読む

20141119-114354.jpg

【iOSアプリ開発】隙間時間で読んで学ぶのにオススメな入門本「はじめてのSwiftプログラミング」

「はじめてのSwiftプログラミング」という入門書が手頃なサイズで、持ち歩いてスキマ時間で読んで

記事を読む

20141031-150402.jpg

アップルのベータテストサービス「TestFlight」が正式公開

アップルが先週の木曜、ベータテストサービス「TestFlight」を正式に公開しました。 Te

記事を読む

iPhoneゲームを簡単に開発したいならこの本がオススメ!「Sprite Kit iPhone 2Dゲームプログラミング」

iPhoneゲームアプリを簡単に開発したいなら「Sprite Kit iPhone 2Dゲームプ

記事を読む

20150106-142403.jpg

Auto Layoutをコードで記述してビューを等間隔に並べる【Swift】

Auto Layoutをコードで記述して、ビューを等間隔に並べる方法について紹介します。ちなみに

記事を読む

I20160409-211651.jpg

Xcode 7.3の新機能についてまとめてみた

2016年3月22日にXcode 7.3がリリースされましたが、自分が知らない機能があるかもしれ

記事を読む

20140818-141439.jpg

iPhoneアプリを作りたい開発初心者にまずはやってみて欲しい3つのこと

今日は、これからiPhoneアプリを作りたい開発初心者の方にやってもらいたいことを書いてみた

記事を読む

20170423-182541
良肌研究室のフェイスウォッシュとオールインワンジェルを使ってみた

株式会社ブラシナさんから、良肌研究室の商品をご提供頂いたので、

I20170228-002742.jpg
約3ヶ月で体脂肪率を6.2%も落とせたキッカケについて

(右上の赤枠内がダイエット開始前、左下の赤枠内が3ヶ月後の数値

I20161224-174949.jpg
「季節の野菜を直接配送!季節のスムージー」を買ってみた

「FiNCモール」で、「季節の野菜を直接配送!季節のスムージー」を

I20161002-152537.jpg
【メンズネイル】東京・新宿のネイルサロンでマットネイルしてもらった

2016年7月18日、東京・新宿のメンズOKなネイルサロン「Tot

I20160925-163452.jpg
タブバーアイコン非選択時の色を変更する方法【iOS 10】

UITabBarControllerで、タブバーアイコン非選択時の

→もっと見る

PAGE TOP ↑