BaseModel

本文介绍了一个Objective-C的基础模型(BaseModel)实现,该模型用于从字典数据中初始化对象并设置属性,通过映射字典键与对象属性之间的关系来完成数据绑定。

#import <Foundation/Foundation.h>


@interface BaseModel : NSObject


- (id)initContentWithDic:(NSDictionary *)jsonDic;

- (void)setAttributes:(NSDictionary *)jsonDic;

- (NSDictionary *)attributeMapDictionary:(NSDictionary *)jsonDic;


@end






#import "BaseModel.h"


@implementation BaseModel


- (id)initContentWithDic:(NSDictionary *)jsonDic

{

    self = [super init];

    if (self != nil) {

        [self setAttributes:jsonDic];

    }

    

    return self;

}


- (void)setAttributes:(NSDictionary *)jsonDic

{

    

    /*

     key:  json字典的key

     value: model对象的属性名

     */

    //mapDic 属性名与json字典的key 的映射关系

    NSDictionary *mapDic = [self attributeMapDictionary:jsonDic];

    

    for (NSString *jsonKey in mapDic) {

        

        //modelAttr:"newsId"

        //jsonKey : "id" 

        NSString *modelAttr = [mapDic objectForKey:jsonKey];

        SEL seletor = [self stringToSel:modelAttr];

        

        //判断self 是否有seletor 方法

        if ([self respondsToSelector:seletor]) {

            //json字典中的value

            id value = [jsonDic objectForKey:jsonKey];

            

            if ([value isKindOfClass:[NSNull class]]) {

                value = @"";

            }

            

            //调用属性的设置器方法,参数是jsonvalue

            [self performSelector:seletor withObject:value];

        }

        

    }

}


/*

  SEL 类型的创建方式有两种,例如:setNewsId: SEL类型

  1.第一种

   SEL selector = @selector(setNewsId:)

  2.第二种

   SEL selector = NSSelectorFromString(@"setNewsId:");

 */


//将属性名转成SEL类型的set方法

//newsId  --> setNewsId:

- (SEL)stringToSel:(NSString *)attName

{

    

    //attName: image

    

    

    //截取收字母

    NSString *first = [[attName substringToIndex:1] uppercaseString]; //I

    NSString *end = [attName substringFromIndex:1];//mage

    

    NSString *setMethod = [NSString stringWithFormat:@"set%@%@:",first,end];

    //setImage:

    

    //将字符串转成SEL类型

    return NSSelectorFromString(setMethod);

}


/*

  属性名与json字典中key的映射关系

    key:  json字典的key

    value: model对象的属性名

 */

- (NSDictionary *)attributeMapDictionary:(NSDictionary *)jsonDic

{

    

    NSMutableDictionary *mapDic = [NSMutableDictionary dictionary];

    

    for (id key in jsonDic) {

        [mapDic setObject:key forKey:key];

    }

    

    /*

     {

        id: @"id"

        image: @"image"

        type: @"type"

     }

     */

    return mapDic;

}


@end


基于部落竞争与成员合作算法(CTCM)融合动态窗口法DWA的无人机三维动态避障方法研究,MATLAB代码 动态避障路径规划:基于部落竞争与成员合作算法(CTCM)融合动态窗口法DWA的无人机三维动态避障方法研究,MATLAB 融合DWA的青蒿素优化算法(AOA)求解无人机三维动态避障路径规划,MATLAB代码 基于动态环境下多智能体自主避障路径优化的DWA算法研究,MATLAB代码 融合DWA的青蒿素优化算法AOA求解无人机三维动态避障路径规划,MATLAB代码 基于DWA的多智能体动态避障路径规划算法研究,MATLAB代码 融合动态窗口法DWA的粒子群算法PSO求解无人机三维动态避障路径规划研究,MATLAB代码 基于粒子群算法PSO融合动态窗口法DWA的无人机三维动态避障路径规划研究,MATLAB代码 基于ACOSRAR-DWA无人机三维动态避障路径规划,MATLAB代码 基于ACOSRAR-DWA无人机三维动态避障路径规划,MATLAB代码 基于DWA的动态环境下无人机自主避障路径优化,MATLAB代码 基于DWA的动态环境下机器人自主避障路径规划,MATLAB代码 基于城市场景下RRT、ACO、A*算法的无人机三维路径规划方法研究,MATLAB代码 基于城市场景下无人机三维路径规划的导航变量的多目标粒子群优化算法(NMOPSO),MATLAB代码 导航变量的多目标粒子群优化算法(NMOPSO)求解复杂城市场景下无人机三维路径规划,MATLAB代码 原创:5种最新多目标优化算法求解多无人机协同路径规划(多起点多终点,起始点、无人机数、障碍物可自定义),MATLAB代码 原创:4种最新多目标优化算法求解多无人机协同路径规划(多起点多终点,起始点、无人机数、障碍物可自定义),MATLAB代码 高维超多目标优化:基于导航变量的多目标粒子群优化算法(NMOPSO)的无人机三维
### Basemodel 默认配置与功能 Basemodel 通常作为模型的基类存在,其默认配置和功能主要体现在以下几个方面: #### 1. **Basemodel 的定义与作用** Basemodel 一般用于定义基础的属性和方法,适用于继承或扩展。它提供了通用的功能支持,例如字段验证、数据序列化和反序列化等[^3]。这些功能使得子类能够专注于实现特定业务逻辑,而无需重复编写基础代码。 #### 2. **字段验证** Basemodel 提供了内置的字段验证机制,确保传入的数据符合预期格式。例如,可以通过定义字段类型和约束条件来实现数据校验: ```python from pydantic import BaseModel, ValidationError, constr class User(BaseModel): name: constr(min_length=3, max_length=50) # 字段验证示例 age: int try: user = User(name="Jo", age=30) except ValidationError as e: print(e.json()) ``` 上述代码展示了如何通过 Basemodel 进行字段验证[^4]。 #### 3. **数据序列化与反序列化** Basemodel 支持将对象转换为 JSON 格式(序列化)或将 JSON 数据转换为对象(反序列化)。这种功能在处理 API 请求和响应时非常有用: ```python # 序列化示例 user_dict = {"name": "Alice", "age": 25} user_model = User(**user_dict) json_data = user_model.json() print(json_data) # 反序列化示例 parsed_user = User.parse_raw('{"name": "Bob", "age": 30}') print(parsed_user.name) ``` 此功能简化了数据处理流程,并确保数据的一致性和完整性[^5]。 #### 4. **默认值与可选字段** Basemodel 支持为字段设置默认值或标记为可选字段,从而提高模型的灵活性。例如: ```python from typing import Optional from pydantic import BaseModel class Settings(BaseModel): debug_mode: bool = False # 默认值 timeout: Optional[int] = None # 可选字段 ``` 通过这种方式,开发者可以更方便地处理缺失或未定义的字段[^6]。 #### 5. **自定义方法** 除了提供默认功能外,Basemodel 还允许开发者定义自定义方法以满足特定需求。例如: ```python class Product(BaseModel): name: str price: float def calculate_discount(self, discount_rate: float) -> float: return self.price * (1 - discount_rate) ``` 这种方法增强了模型的功能性,使其更加适应复杂的业务场景[^7]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值