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

関連記事

I20160102-131507.jpg

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

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

記事を読む

I20160118-223109.jpg

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

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

記事を読む

I20151119-165939.jpg

Swift 2.1に対応した本「詳解 Swift 改訂版」が出るぞ!

Swiftの文法に関する解説書の定番「詳解 Swift」の、Swift2.1に対応した改訂版「詳

記事を読む

20140721-170305.jpg

プロトタイピングのツールや手法を学べる「プロトタイピング実践ガイド」

株式会社インプレスさまより献本御礼。 プロトタイピング実践ガイド スマホアプリの効率的なデザイ

記事を読む

I20151031-175009.jpg

初心者にオススメの本!Swiftではじめる iPhoneアプリ開発の教科書【Swift 2&Xcode 7対応】

     Xcode 7とSwift 2に対応したアプリ開発の入門書籍「Swiftでは

記事を読む

I20160207-111059.jpg

【Swift】Xcodeで型推論された変数や定数の型を調べる方法

Swiftには、そのデータ型が明らかであれば型を明記する必要が無い「型推論」という機能があります

記事を読む

I20150724-135442.jpg

iPhoneのホーム1画面目に置いているオススメなアプリ38本(2015年9月版)

2014年7月に「iPhoneアプリ開発にオススメの本10選(2014年7月版)」という記事

記事を読む

I20151030-214417.jpg

【開発本】SpriteKitの入門書籍「iPhoneのゲームアプリをつくろう!」

SwiftとSpriteKitでiPhoneゲームアプリを開発するための入門書「iPhone

記事を読む

20141006-103526.jpg

Xcode 6におけるNSUserDefaultsのplistの在り処と、内容を確認・書き換え・削除する方法

Xcode 6にて、NSUserDefaultsのplistファイルの在り処と、内容を確認・書き

記事を読む

20141222-120336.jpg

【Swift】PlaygroundでUIImageに画像を読み込む方法

SwiftのPlayground内にて、UIImageに画像ファイルを読み込む方法を紹介しま

記事を読む

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で、タブバーアイコン非選択時の

I20160924-123726.jpg
iPad Pro 9.7インチ SIMフリーモデルにFREETELのSIMを入れて使ってみた

今までiPad miniで使っていたFREETELのSIM

→もっと見る

PAGE TOP ↑