辞書をモデルに変換する簡単な紹介と使用



ディクショナリモデル
0>辞書回転モデルの意味:辞書のデータをモデルで保存します.新しいクラスを作成し、辞書のキー値のペアの数に基づいて、このクラスの属性を記述し、将来、このクラスのオブジェクトの属性で辞書の各キーに対応する値を保存します.
1>なぜ辞書をモデル化するのですか?
*ディクショナリの欠陥:
0>コードを書くときに辞書のキーにはスマートヒントはありませんが、モデルのプロパティにはスマートヒントがあります.
1>「キー」は文字列で、書き間違えた場合、コンパイラはエラーを報告しない(コンパイル時にエラーを報告しない)、実行時にエラーが発生する可能性があり、エラーが発生するとエラーを探しにくい.
2>[モデル](Model)を使用すると、オブジェクト向けの3つの特長(カプセル化、継承、マルチステート)をより便利に拡張できます.
*モデルとは?「モデル」はカスタムクラスで、「クラス」にさまざまなプロパティを追加してデータを保存します.
*ディクショナリモデルはどこのコードを修正しますか?
1>モデルクラスの作成
2>データをリロードするときは、ロードしたデータをモデルオブジェクトに配置し、モデルオブジェクトを配列に配置します.
コードは次のとおりです.
app.plistファイル
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<array>
	<dict>
		<key>name</key>
		<string>    </string>
		<key>icon</key>
		<string>icon_00</string>
	</dict>
	<dict>
		<key>name</key>
		<string>      </string>
		<key>icon</key>
		<string>icon_01</string>
	</dict>
	<dict>
		<key>name</key>
		<string>Flappy Bird</string>
		<key>icon</key>
		<string>icon_02</string>
	</dict>
	<dict>
		<key>name</key>
		<string>    </string>
		<key>icon</key>
		<string>icon_03</string>
	</dict>
	<dict>
		<key>name</key>
		<string>    </string>
		<key>icon</key>
		<string>icon_04</string>
	</dict>
	<dict>
		<key>name</key>
		<string>     </string>
		<key>icon</key>
		<string>icon_05</string>
	</dict>
	<dict>
		<key>name</key>
		<string>     </string>
		<key>icon</key>
		<string>icon_06</string>
	</dict>
	<dict>
		<key>name</key>
		<string>     </string>
		<key>icon</key>
		<string>icon_07</string>
	</dict>
	<dict>
		<key>name</key>
		<string>    2</string>
		<key>icon</key>
		<string>icon_08</string>
	</dict>
	<dict>
		<key>name</key>
		<string>    </string>
		<key>icon</key>
		<string>icon_09</string>
	</dict>
	<dict>
		<key>name</key>
		<string>    2</string>
		<key>icon</key>
		<string>icon_10</string>
	</dict>
	<dict>
		<key>name</key>
		<string>    </string>
		<key>icon</key>
		<string>icon_11</string>
	</dict>
</array>
</plist>
モデルファイル:
CZApp.h以下:
#import <Foundation/Foundation.h>

@interface CZApp : NSObject
@property(nonatomic,copy) NSString *name; //         ,    
@property(nonatomic,copy) NSString *icon;

-(instancetype)initWithDict:(NSDictionary *)dict;  //    
+(instancetype)appWithDict:(NSDictionary *)dict; //      

@end
CZApp.mファイルは以下の通りです.
#import "CZApp.h"

@implementation CZApp
-(instancetype)initWithDict:(NSDictionary *)dict
{
    if(self=[super init])
    {
        self.name=dict[@"name"];
        self.icon=dict[@"icon"];
    }
    return self;
    
}
+(instancetype)appWithDict:(NSDictionary *)dict
{
    return [[self alloc]initWithDict:dict];
}

@end
ViewController.mファイル(使用)
@interface ViewController ()
@property(nonatomic,strong) NSArray *apps;

@end

@implementation ViewController

//  get  ,     
-(NSArray *)apps{
    
    if (_apps==nil) {
        {
            //  app.plist         
            NSString *path=[[NSBundle mainBundle]pathForResource:@"app.plist" ofType:nil];
        
        //2.        
            NSArray *arrDict=[NSArray arrayWithContentsOfFile:path];
            
        // 3.                        
            NSMutableArray *arrayModels=[NSMutableArray array];
            
        // 4.       ,                 
            
            for (NSDictionary *dict in arrDict) {
                CZApp *model=[CZApp appWithDict:dict];
                
                [arrayModels addObject:model];
            }
                 _apps=arrayModels;
            
            
        }
        
    }
    return _apps;
}<pre name="code" class="objc">@end

関連する知識点:
*データのリロード:データフィールドを書き換えるgetメソッド
*ディクショナリをモデルに変換するプロセスを「モデル」の内部にカプセル化
*理由:将来、このモデルは多くの場所で使用される可能性があります(たとえば、多くのコントローラがこのモデルを使用しています)、モデルを使用するたびに辞書のデータをモデル属性に割り当てるコードを書く必要があります.この場合、これらの付与文をモデル内部にカプセル化すると、使用の複雑さとコード量が大幅に簡略化されます.
*考え方:
1>NSDictionaryのパラメータをモデル内で受け入れ、モデル内のNSDictioanryのデータをモデルのプロパティに割り当てます.
2>initWithDictメソッドとappWithDictメソッドをカプセル化
*idとinstancetypeの紹介
1.idをメソッドとして使用して値を返す問題:
1>メソッドの戻り値を受信するときに任意のタイプを使用して受信できます.コンパイルはエラーを報告しませんが、実行時にエラーが発生する可能性があります.
2.instancetypeの注意点
1>instancetypeタイプ表示ではidと同様に任意のオブジェクトタイプを表す
2>instancetypeは戻り値タイプとしてのみ使用でき、idのように変数を宣言したり、パラメータとして使用したりすることはできません.
3>instancetypeを使用すると、コンパイラはinstancetypeの実際のタイプを検出し、タイプが一致しない場合はコンパイル時にエラーを報告します.(instancetypeがどのタイプに現れるかは対応するタイプを表す)
不適切な点、批判指摘、共同学習、共同向上!