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コード)

関連記事

I20160118-223109.jpg

Swift 2でシングルトンを初期化・呼び出しする方法

Swift 2でシングルトンを実装する方法について解説したいと思います! (※「シングルトンを

記事を読む

I20150721-164252.jpg

【書籍】iPhoneアプリ開発の初心者にオススメの本「詳細! Swift iPhoneアプリ開発 入門ノート」

     Swift 1.1、Xcode 6.1、iOS 8.1に対応している書籍「詳

記事を読む

I20160208-152320.jpg

【Swift】privateなタイプメソッド作るなら、privateな関数でも良いかもと思った

structとかclassの中で、ちょっとした処理を担当させるprivateなタイプ

記事を読む

I20160125-104438.jpg

iPhoneアプリの開発に必要なものをまとめてみた

僕はアプリ開発講座を開催していますが、その関係もあって「iPhoneアプリを開発するには、ど

記事を読む

I20160411-122213.jpg

Swift 2.2の変更点をまとめてみた

2016年3月22日、Xcode 7.3と共にSwift 2.2が正式にリリースされました。

記事を読む

I20160228-162014.jpg

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

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

記事を読む

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

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

記事を読む

20160508-170745.jpg

SwiftTaskで失敗したタスクによって異なるエラー処理を行う方法

SwiftTaskで複数のタスクを.successでチェーンさせ、失敗したタスクによって

記事を読む

I20150907-185322.jpg

uGUIの使い方が分かる本「uGUIではじめるUnity UIデザインの教科書」

株式会社マイナビ様より献本御礼。 本書は、公式のUIフレームワーク「Unity UI(uGUI

記事を読む

20140818-141439.jpg

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

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

記事を読む

PAGE TOP ↑