• swift 初始化model的一个注意 如果在继承NSObject的model类里不进行初始化,即如下代码: override init(){ super.init() } 在调用这个类初始化的时候,需要这样写(加一个中括号): var tempItemModel = ...
    swift 初始化model的一个注意
    
    如果在继承NSObject的model类里不进行初始化,即如下代码:
     override init(){
         super.init()
     }
    在调用这个类初始化的时候,需要这样写(加一个中括号):
    var tempItemModel = [HomeModel]()
    
    
    如果在model类里边进行了初始化,在调用这个类的时候,就可以正常写了:
    var tempItemModel = HomeModel()
    

    展开全文
  • 在OC里,给tableView cell赋值的时候在cell里写一个对应的model,直接写model的set方法就可以很方便的赋值,在Swift里如果想以这种方式赋值可以如下方法: 在cell里的代码 private var tempModel:...

    在OC里,给tableView  cell赋值的时候在cell里写一个对应的model,直接写model的set方法就可以很方便的赋值,在Swift里如果想以这种方式赋值可以如下方法:

    在cell里的代码

        private var tempModel:contentMallGoodModel? = contentMallGoodModel()
        var model : contentMallGoodModel {
            set {
                tempModel = newValue
                self.nameLabel?.text = tempModel?.name
                self.priceLabel?.text = (tempModel?.price!)!+"积分"
                self.productStockpileLabel?.text = "商品库存:"+(tempModel?.stock!)!
                //在这里给cell里的属性赋值
            }
            get {
                return (self.tempModel)!
            }
            
        }
    
    tableView 代理方法里赋值的代码
    注意,cell.model不出现提示的时候可以给cell一个as?声明

                var cell = tableView.dequeueReusableCell(withIdentifier: "goldorder") as? MZMallDetailCell
                if (cell == nil) {
                    cell = MZMallDetailCell.init(style: .subtitle, reuseIdentifier: "goldorder")
                }
                if self.model==nil {
                    
                }else{
                    cell?.model = (self.model)!
    
                }
                cell?.backgroundColor = UIColor.white
                return cell!
    



    展开全文
  • ActivityModel *activityModel = [[ActivityModel alloc] init];  [activityModel setValuesForKeysWithDictionary:temp]; //KVC赋值  [self.dataArray addObject:activityModel]; 需要注意的是 KVC赋值的时候


    KVC 详解 http://www.2cto.com/kf/201507/415647.html


     ActivityModel *activityModel = [[ActivityModel alloc] init];

            [activityModel setValuesForKeysWithDictionary:temp];  //KVC赋值
            [self.dataArray addObject:activityModel];

    需要注意的是 KVC赋值的时候  所创建model模型里面的属性必须和KVC字典里的key值相对应

         如果model里面的属性可以是不属于比KVC的字典的key 


    但是kvc里面的key 如果在model里面没有对应的属性,model必须重写方法

      -(void)setValue:(id)value forUndefinedKey:(NSString *)key{}

    不写的话 会报错
        setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key image_hlarge.

    为了实现对嵌套json的处理,(后者自定义key的赋值方法)我们需要重写-(void)setValue:(id)value forKey:(NSString *)key方法

    例子:见最后

    ======================================================================

    KVO

    只要对被观察者被重新赋值 就会走观察方法 不管所赋的值是否变化

    -(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
    {
        
        NSLog(@"%@",keyPath);
        NSLog(@"%@",object);
        NSLog(@"%@",change);
        NSLog(@"%@",context);
        
        //1.取值
        id new = [object valueForKeyPath:keyPath];
        NSLog(@"%@",new);

       //2.取值
        id new1 = [change objectForKey:NSKeyValueChangeNewKey];
        NSLog(@"new1---%@",new1);
    }

    // KVC 赋值例子

    @interface DetailModel :NSObject

    @property (nonatomic,copy)NSString *name;

    @property (nonatomic,copy)NSString *objectId;

    @property (nonatomic,copy)NSString *userId;

    @property (nonatomiccopyNSString *createdAt;

    @property (nonatomic,copy)NSString *headerImage;

    @property (nonatomicassignNSNumber *age;

    @implementation DetailModel

    -(void)setValue:(id)value forUndefinedKey:(NSString *)key { 

    }

    -(void)setValue:(id)value forKey:(NSString *)key {

        if ([keyisEqual:@"headerImage"]) {

    // 自定义 headerImage的赋值 因为headerImage 在返回中是个字典,而有用的只要url

            _headerImage = [valueobjectForKey:@"url"];

        } else {

            [supersetValue:valueforKey:key];

        }

    }

    -(NSString*)description;


    JSON: 

     {

        age = 20;

        createdAt = "2015-09-17T02:40:45.219Z";

        headerImage =     {

            "__type" = File;

            bucket = sNkArza7;

            createdAt = "2015-09-17T10:48:35.621Z";

            key = "KsjzUhNAdymW0FNjcxEgR3D.png";

            metaData =         {

                "_checksum" = 121f6ec8713bfd3a7c6143fb2a0f5d4d;

                owner = 55fa1da860b232fc2abc51d7;

                size = 2369719;

            };

            "mime_type" = "image/png";

            name = "avatar.png";

            objectId = 55fa9a83ddb2e44a4844974c;

            updatedAt = "2015-09-17T10:48:35.621Z";

            url = "http://ac-sNkArza7.clouddn.com/KsjzUhNAdymW0FNjcxEgR3D.png";

        };

        name = "\U660e\U661f";

        objectId = 55fa282d60b25f2389575a49;

        updatedAt = "2015-09-17T10:48:38.259Z";

        userId = 55fa1da860b232fc2abc51d7;

    }

    DetailModel *model = [[DetailModelalloc]init];

     [model setValuesForKeysWithDictionary:responseObject];

    NSLog(@"%@", model);

     userId: 55fa1da860b232fc2abc51d7,

     name: 明星

     objectId: 55fa282d60b25f2389575a49, 

     age: 20, 

     creat: 2015-09-17T02:40:45.219Z, 

     _headerImage: http://ac-sNkArza7.clouddn.com/KsjzUhNAdymW0FNjcxEgR3D.png





    展开全文
  • swift中模型Model的创建

    2016-08-17 15:46:13
    那么在swift中模型也同样重要下面介绍一下模型的赋值 1.介绍下 模型一键赋值的代码 setValuesForKeyWithDictionary 这句话的作用 是把字典Dictionary中的key对应的Value 赋值给模型中的与key一样的属性 1)分三种...

    //简介 oc是一个面向对象即模型的开发,一般规范的开发都是以模型作为对象进行开发的。那么在swift中模型也同样重要下面介绍一下模型的赋值

    1.介绍下 模型一键赋值的代码 setValuesForKeyWithDictionary 这句话的作用 是把字典Dictionary中的key对应的Value 赋值给模型中的与key一样的属性

    1)分三种情况 第一种情况是 模型中的属性等于 字典中的额key 并且一一对应 那么可以赋值

    2)第二种 模型中的属性大于字典中的key即模型除了与字典一一对应的属性之外还有其他属性 那么这个赋值也有用

    3)第三种 模型中的属性小于或者字典中存在模型中没有的属性名字 那么就会报错

    2.针对第三种情况 解决办法是  在模型中加上这句话就可以了 不要进行任何操作

    override func setValue(value:AnyObject?, forUndefinedKey key:String) {

    }
    下面附上代码例子
    //这边是创建一个简单 Person的模型 然后在界面赋值

    import UIKit


    class PersonModel: NSObject {


        //这是一个Person模型

        /// 年龄

        var age:Int =0

        /// 姓名

        var name:String =""

        /// 性别

        var sex:String =""

        /// 这边定义一个在字典里面的keyswift中的关键字的属性

        var undefine:String =""

        

        /**

         这个方法是防止使用setvalueforkeysWithDictionary的时候字典里的key在模型里面没有处理方法一般是把方法写出来里面不用写东西这样字典里出现模型没有的key的时候不会报错也不会赋值(除非像下面自己手动赋值)

         

         - parameter value: 模型中未定义的key值对应的value

         - parameter key:   模型中未定义的key值或者跟跟关键字冲突的字典的key

         */

        overridefunc setValue(value: AnyObject?, forUndefinedKey key:String) {

            if key =="Int"

            {

                undefine = valueas! String

            

            }

        }

        

        /**

         写一个构造函数主要目的是让其初始化的时候就有进行模型赋值不然一般步骤是创建这个模型然后模型进行setvaluesForkeywithdictionary

         

         - returns: 返回赋值后的模型

         */

        overrideinit() {

            super.init()

            let dic = ["age":18,"name":"Clement","sex":"man","Int":"test"]

            //模型一键赋值这个其实是运用了kvc的原理

            self.setValuesForKeysWithDictionary(dic)

            

        }

        /**

         这边是自定义的构造函数可以从外面传参使其初始化

         

         - parameter dic: 初始化模型的字典

         

         - returns: 返回赋值后的模型

         */

        init(dic:[String:AnyObject])

        {

            super.init()

            //模型一键赋值这个其实是运用了kvc的原理

            self.setValuesForKeysWithDictionary(dic)

        

        }

        

    }





    import UIKit


    class ViewController: UIViewController {


        overridefunc viewDidLoad() {

            super.viewDidLoad()

        

            //方式1用构造函数初始化并打印结果这个是自带的模型

            let personOne =PersonModel()

            print("模型的参数\(personOne.age\(personOne.name\(personOne.sex\(personOne.undefine)")

            

            //方式二用自定义的构造函数

            let dic = ["age":28,"name":"Clement__","sex":"man__ ","Int":"nuewtype"]

            let personTwo =PersonModel.init(dic: dic)

            print("模型TWO的参数\(personTwo.age\(personTwo.name\(personTwo.sex\(personTwo.undefine)")

            

            //方式三不写构造函数(即不用init

            let personThree =PersonModel()

            let dicThree = ["age":38,"name":"Clement__three","sex":"man__Three","Int":"nuewtype_three"]

            //外部对模型进行赋值

            personThree.setValuesForKeysWithDictionary(dicThree)

            print("模型Three的参数\(personThree.age\(personThree.name\(personThree.sex\(personThree.undefine)")

        }


        overridefunc didReceiveMemoryWarning() {

            super.didReceiveMemoryWarning()

            // Dispose of any resources that can be recreated.

        }



    }


    //输出结果

    模型的参数18  Clement  man  test

    模型TWO的参数28  Clement__  man__   nuewtype

    模型Three的参数38  Clement__three  man__Three  nuewtype_three



    最后附上oc部分的说明的一篇很好的文章 http://www.jianshu.com/p/870eb4b4170a

    展开全文
  • 以前:直接赋值 PersonModel.h文件中 @property (nonatomic,copy)NSString *name; @property (nonatomic,copy)NSString *sex; @property (nonatomic,copy)NSString *age; 字典: NSDictionary *dic = @{@

    以前:直接赋值

    PersonModel.h文件中

        @property (nonatomic,copy)NSString *name;
        @property (nonatomic,copy)NSString *sex;
        @property (nonatomic,copy)NSString *age;

    字典:

         NSDictionary *dic = @{@"name":@"张三",@"sex":@"男",@"age":@"22"};

    赋值:

         PersonModel *test=[[PersonModel alloc]init];
            test.name=dic[@"name"];
            test.sex=dic[@"sex"];
            test.age=dic[@"age"];

    现在:用setValuesForKeysWithDictionary

     [test setValuesForKeysWithDictionary:dic];

    产生问题

    1. 如果model里面的有不存在于dic中的元素会怎样?

    在Model文件中添加一行

        @property (nonatomic,copy)NSString *other;

    并输出得时候输出:test.other=(null)

    dic中得值可以完全赋值给model,而other没有被赋值,所以值是空的。

    2.如果dic里面的有不存在于model中的元素会怎样?

    在Model文件中删除一行

        @property (nonatomic,copy) NSString* age;

    在删除对应得输出后运行。

    崩溃!

    因为在model中,没有对应的age属性,所以导致了程序崩溃。

    解决方式就是实现一个方法setValue:forUndefinedKey: 这个方法能过滤掉不存在的键值。

    在model中添加。
    h文件中添加:

        -(void)setValue:(id)value forUndefinedKey:(NSString *)key;

    并需要在m文件中实现:

        -(void)setValue:(id)value forUndefinedKey:(NSString *)key{
    
        }

    3.如果dic中的key与model中的变量名字不同,应该怎么赋值?

    从前面我们可以知道,dic中key赋值给model中与key同名的属性。
    那么如果dic中得key值为 username,model中的名字为name,又或是dic中的key值为ID,INT 等关键字,应该怎么变化。
    答案也是从setValue:forUndefinedKey方法入手。

    首先我们把dic的值改变:

        NSDictionary *dic = @{@"username":@"张三",@"sex":@"男",@"id":@"22"};

    model中的属性:

        @property (nonatomic,copy)NSString *name;
        @property (nonatomic,copy)NSString *sex;
        @property (nonatomic,copy) NSString* age;

    完善model中的setValue:forUndefinedKey方法

        -(void)setValue:(id)value forUndefinedKey:(NSString *)key{
            if([key isEqualToString:@"id"])
            {
                self.age=value;
            }
            if([key isEqualToString:@"username"])
            {
                self.name=value;
            }
        }


    文/嘻嘻zhy(简书作者)
    原文链接:http://www.jianshu.com/p/870eb4b4170a
    著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。






    展开全文
  • 在前几天的一篇博客《iOS开发之使用Runtime给Model赋值》中介绍了如何使用运行时在实体类的基类中添加给实体类的属性赋值的方法,这个方法的前提是字典的Key必须和实体类的Property Name相同,然后通过运行时来...
  • swift2.0中的反射,实现对象 字典相互转换 ===========mrshan 2016.1.14 ========================== 首先介绍一下Swift中的反射,在2.0中做了一定的修改,要获取它的运行时(Reflect),要对这个实例化对象调用...
  • @{  string controlId = string.Format("product_attribute_{0}", Model.Id);   }
  •  开始学swift,大家不知道有没有我这个疑问,现在用let var 来给常量变量赋值,那么以前OC那些属性修饰符在swift 是怎么用呢?  swift let var 是strong 强引用 是weak 弱引用 还是copy 呢。带着这个问题,测试...
  • 在OC中,我们有很多优秀的第三方库帮助我们实现,比如MJExtension、JSONModel等,这些库基本都是利用runtime实现读取属性名并利用kvc重新赋值属性。 在Swift中,由于runtime的局限,比较出名的有SwiftyJSON、...
  • 但是在接触swift之后。刚开始时感觉有点扯淡 ,但是慢慢的机会发现 原来swift会让你的程序开发变得如此美妙,下面就是我理解的MVC中的M层 修改 import 语句来引入 UIKit 代替 Foundation: import UIKit ...
  • 结构体是可以作为 model 类使用的不过也要 写下的创建方法 import UIKit/***创建一个model 结构,重写init 方法,结构体的属性不能出现可选类型**/ struct Model { var title :String var url :String ...
  • 很多时候我们需要把从服务器端请求下来的数据转成model类,今天就介绍一下如何利用runtime实现字典转模型1、首先先建一个model类class Person:NSObject {  var name:String?  var age:NSNumber? } 2、为NSObject...
  • 在OC编程时,我们可以使用一个prefix文件对于常用的变量和常量甚至方法进行定义,(比如SCREEN_WIDTH)以提高开发效率,然而在swift开发的时候,这样的做法就会比较麻烦,因为涉及到oc和swift的交互. 但是,由于swift的变量...
  • 为什么不直接将获取到的数据赋值给对应的显示控件呢? 答案是: 模型(专门存放数据的对象)其实就是一个用来存储和读取你网络请求获取到的数据的容器,用来存放和读取你的数据,数据模型,专门用来存放数据的对象,...
  • 我们都知道KVC 是OC NSobject特有的,之前在Swift4.0之前,继承NSobject的对象,可用动态的拿到字典调用KVC给模型赋值。只是比较省事的操作,有没有定义属性,只要从写UndefinedKey这个属性即可。  还是用代码演示...
  • 很多时候,我们从服务端请求下的数据都是Json格式,我们需要拿...在OC中,我们有很多优秀的第三方库帮助我们实现,比如MJExtension、JSONModel等,这些库基本都是利用runtime实现读取属性名并利用kvc重新赋值属性。...
  • setter方法说明:在属性被赋值的时候,会调用该属性对应的setter方法,以此实现控件动态赋值 存在问题 在学习自定义控件的过程中,刚开始的时候碰到问题是如何给各控件动态赋值,最初的想法是把各控件属性放在.h...
  • -(void)loadDataFromModel:(DemoModel *)model{ if(model){ [self.ImgV sd_setImageWithURL:[NSURL URLWithString:model.clientcover1]]; self.Zlabel.text = model.setname; ...
  • swift for 循环

    2019-03-19 16:24:10
    swift 4.2 中已经舍弃了传统的C语言的for;;循环,替换成更能符合本身语言特性的新形式。 第一种 for - in 这一种是最常用的,可以遍历所有的集合类。如下: func testFor(){ let list = [1,2,3,4]; for idx ...
1 2 3 4 5 ... 20
收藏数 1,519
精华内容 607
热门标签