并让字段的首字母小写,Runtime天性之提到对象

引言:近期在职业中蒙受与一些API对接的post的数量供给将对象的字段首字母小写。
消除办法有三种:
首先种:使用对象的字段属性设置JsonProperty来贯彻(不引入,因为急需手动的修改种种字段的属性)

并让字段的首字母小写,Runtime天性之提到对象。前言

现在你准备用1个系统的类依然是您写的类,可是那一个类并无法满意你的须求,你要求万分增加二个性子。1般化解办法要么是extends,要么采用category。而笔者并不引入应用extends,重如若耦合性太强,1般本人动用category。大家都清楚,分类中是无能为力设置属性的,假诺在分拣的注脚中写@property
只好为其生成get 和 set
方法的宣示,不过有时使用项目也亟需充实三个额外属性,那么如何是好呢?那年,runtime的关联属性就能发挥它的功效了。壹般都是key
value 的存在。

多年来项目用到了bootstrap框架,当中前者用的校验,选取的是bootstrapvalidator插件,也是不行强大的1款插件。作者那边用的是0.五.贰本子。

质量是类提需求外部调用时用,的能够利用对象.属性设置或读取二个值get{returexxx;}表示可读set{xxx=value;}表示可写 字段便是类内部用的,用来储存数据 private字段;

public class UserInfo
{
    [JsonProperty("id")]
    public int Id{ set; get; }
    [JsonProperty("userName")]
    public string UserName{ set; get; }
}

至于的章程

objc_setAssociatedObject 设置关联对象使用objc_getAssociatedObject
获得涉及对象使用objc_removeAssociatedObjects 移除关联对象使用

上面记录一下应用中读书到的连带API,不定时更新。

public属性;

第一种:使用newtonsoft.json来设置格式化的措施(推荐应用)

用法

貌似笔者用在category里,合理使用它能让category发挥越来越大的效果。

  • UIViewcategory

.h文件

#import <UIKit/UIKit.h>@interface UIView typedef void (^GestureActionBlock)(UIGestureRecognizer *ges);/** 单点击手势 */- tapGesture:(GestureActionBlock)block;/** 长按手势 */- longPressGestrue:(GestureActionBlock)block;@end

.m文件

#import "UIView+WT.h"#import <objc/runtime.h>@implementation UIView static char kActionHandlerTapBlockKey;static char kActionHandlerTapGestureKey;static char kActionHandlerLongPressBlockKey;static char kActionHandlerLongPressGestureKey;//单点击手势- tapGesture:(GestureActionBlock)block { self.userInteractionEnabled = YES; UITapGestureRecognizer *gesture = objc_getAssociatedObject(self, &kActionHandlerTapGestureKey); if  { gesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleActionForTapGesture:)]; [self addGestureRecognizer:gesture]; objc_setAssociatedObject(self, &kActionHandlerTapGestureKey, gesture, OBJC_ASSOCIATION_RETAIN); } objc_setAssociatedObject(self, &kActionHandlerTapBlockKey, block, OBJC_ASSOCIATION_COPY);}- handleActionForTapGesture:(UITapGestureRecognizer *)gesture { if (gesture.state == UIGestureRecognizerStateRecognized) { GestureActionBlock block = objc_getAssociatedObject(self, &kActionHandlerTapBlockKey); if  { block; } }}//长按手势- longPressGestrue:(GestureActionBlock)block { self.userInteractionEnabled = YES; UILongPressGestureRecognizer *gesture = objc_getAssociatedObject(self, &kActionHandlerLongPressGestureKey); if  { gesture = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleActionForLongPressGesture:)]; [self addGestureRecognizer:gesture]; objc_setAssociatedObject(self, &kActionHandlerLongPressGestureKey, gesture, OBJC_ASSOCIATION_RETAIN); } objc_setAssociatedObject(self, &kActionHandlerLongPressBlockKey, block, OBJC_ASSOCIATION_COPY);}- handleActionForLongPressGesture:(UITapGestureRecognizer *)gesture { if (gesture.state == UIGestureRecognizerStateBegan) { GestureActionBlock block = objc_getAssociatedObject(self, &kActionHandlerLongPressBlockKey); if  { block; } }}@end

小编表达下里面包车型大巴片段首要字段,比如OBJC_ASSOCIATION_RETAIN以此字段实际上是个枚举来的

typedef OBJC_ENUM(uintptr_t, objc_AssociationPolicy) { OBJC_ASSOCIATION_ASSIGN = 0, /**< Specifies a weak reference to the associated object. */ OBJC_ASSOCIATION_RETAIN_NONATOMIC = 1, /**< Specifies a strong reference to the associated object. * The association is not made atomically. */ OBJC_ASSOCIATION_COPY_NONATOMIC = 3, /**< Specifies that the associated object is copied. * The association is not made atomically. */ OBJC_ASSOCIATION_RETAIN = 01401, /**< Specifies a strong reference to the associated object. * The association is made atomically. */ OBJC_ASSOCIATION_COPY = 01403 /**< Specifies that the associated object is copied. * The association is made atomically. */};

用法跟@property中的strong 、weak、copy 、assign 、retain等证明属性的修饰符同样,笔者下面用到了block就对应OBJC_ASSOCIATION_COPY,而UITapGestureRecognizerUILongPressGestureRecognizer则对应OBJC_ASSOCIATION_RETAIN进展修饰。当然实际上小编的UIViewcategory频频那么些,能够参见笔者付出品种总计的1套库WTSDK大概有个别地点描述得不是很好,或许描述失实了,希望您们能给本身留言,thank!

一. 获取validator对象或实例

透过质量访问字段 讲概念恐怕倒霉讲,上面来看2个事例吗!

 var user = new { Name = "john", Age = 19 }; 
 var serializerSettings = new JsonSerializerSettings
            {
                // 设置为驼峰命名
                ContractResolver = new CamelCasePropertyNamesContractResolver()
            };
var userStr = JsonConvert.SerializeObject(user, Formatting.None, serializerSettings);

 壹般接纳校验是直接调用$(form).bootstrapValidator(options)来伊始化validator。初步化后有三种办法获得validator对象或实例,能够用来调用其指标的不二等秘书诀,比如调用resetForm来重新初始化表单。有三种方式得到:

classProgram{ privateint田野先生一;//那一个field一正是字段publicintField1//以此Fileds一正是性质

以上正是化解办法,看到那几个布局的材料比较少,做下记录

 1) 

{       get{returnfield1;}       set{field1=value;}

// Get plugin instance
var bootstrapValidator = $(form).data('bootstrapValidator');
// and then call method
bootstrapValidator.methodName(parameters)

     }        }//因为字段的走访修饰符为private外部不可能访问它,但能够定义属性为public来访问。希望对您有援救啊。

是因为品质的真相是格局(get或set方法)

假如满意下边多少个标准化,那么大家便得以大胆地运用国有字段:

一. 允许私行读写;

二. 取值范围只受数据类型约束而无别的任何特定限制;

叁. 值的改变不须求抓住类中其余任何成员的附和改变;

质量的使用条件则正好跟变量相反,只要满意上面任何一个口径,就相应运用性质:

一. 供给字段只好读大概只好写;

2. 急需限制字段的取值范围;

三. 在改换二个字段的值的时候希望退换目的的此外壹些情景;

小结:就算在实际上项指标付出过程中,公共字段和总体性在适用的口径下都得以运用,不过大家应该尽量的运用品质,而不是数码成员;把具有的字段都安装为私有字段,假诺要暴露它们,则把它们封装成属性,那也是微软引入的方法。

那种措施得到的是BootstrapValidator的实例,能够一贯调用其方法。

2) 

$(form).bootstrapValidator(methodName, parameters);

 那种办法获得的是表示当前form的jquery对象,调用格局是将方法名和参数分别传入到bootstrapValidator方法中,能够链式调用。
 二种艺术的行使各自如下:

// The first way
$(form)
  .data('bootstrapValidator')
  .updateStatus('birthday', 'NOT_VALIDATED')
  .validateField('birthday');

// The second one
$(form)
  .bootstrapValidator('updateStatus', 'birthday', 'NOT_VALIDATED')
  .bootstrapValidator('validateField', 'birthday');

2. defaultSubmit()

利用默许的交给情势提交表单,调用此格局BootstrapValidator将不实行其余的校验。壹般需求时得以投身validator校验的submitHandler属性里调用。

使用:

$('#defaultForm').bootstrapValidator({
 fields: {
   username: {
 message: 'The username is not valid',
 validators: {
   notEmpty: {
  message: 'The username is required and can\'t be empty'
   }
 }
   }
 },
 submitHandler: function(validator, form, submitButton) {
   // a)
   // Use Ajax to submit form data
   //$.post(form.attr('action'), form.serialize(), function(result) {
 // ... process the result ...
   //}, 'json');

   //b)
   // Do your task
   // ...
   // Submit the form
   validator.defaultSubmit();
 }
});

3. disableSubmitButtons(boolean) 

启用或剥夺提交开关。BootstrapValidator里默许的付出按键是怀有表单内的type属性值为submit的开关,即[type=”submit”]。
使用:

当登录战败时,重新启用提交开关。

$('#loginForm').bootstrapValidator({
    message: 'This value is not valid',
    feedbackIcons: {
      valid: 'glyphicon glyphicon-ok',
      invalid: 'glyphicon glyphicon-remove',
      validating: 'glyphicon glyphicon-refresh'
    },
    submitHandler: function(validator, form, submitButton) {
      $.post(form.attr('action'), form.serialize(), function(result) {
        // The result is a JSON formatted by your back-end
        // I assume the format is as following:
        // {
        //   valid: true,     // false if the account is not found
        //   username: 'Username', // null if the account is not found
        // }
        if (result.valid == true || result.valid == 'true') {
          // You can reload the current location
          window.location.reload();

          // Or use Javascript to update your page, such as showing the account name
          // $('#welcome').html('Hello ' + result.username);
        } else {
          // The account is not found
          // Show the errors
          $('#errors').html('The account is not found').removeClass('hide');

          // Enable the submit buttons
          $('#loginForm').bootstrapValidator('disableSubmitButtons', false);
        }
      }, 'json');
    },
    fields: {
      username: {
        validators: {
          notEmpty: {
            message: 'The username is required'
          }
        }
      },
      password: {
        validators: {
          notEmpty: {
            message: 'The password is required'
          }
        }
      }
    }
  });

 4. enableFieldValidators(field, enabled)

启用或剥夺内定字段的具备校验。那里笔者的实

验结果是①旦禁止使用了校验,好像对应的字段输入(文本框、下拉等)也会产生禁止使用。
使用:

当密码框不为空时,开启密码框和认同密码框的校验:

 // Enable the password/confirm password validators if the password is not empty
  $('#signupForm').find('[name="password"]').on('keyup', function() {
    var isEmpty = $(this).val() == '';
    $('#signupForm').bootstrapValidator('enableFieldValidators', 'password', !isEmpty)
            .bootstrapValidator('enableFieldValidators', 'confirm_password', !isEmpty);
    if ($(this).val().length == 1) {
      $('#signupForm').bootstrapValidator('validateField', 'password')
              .bootstrapValidator('validateField', 'confirm_password');
    }
  });

伍.
getFieldElements(田野(field))依照钦命的name获取钦赐的成分,再次回到值是null或1个jQuery对象数组。  

6.
isValid()重回当前须求验证的具有字段是还是不是都合法。
调用此措施前需先调用validate来拓展求证,validate方法可用在急需点击按键恐怕链接而非提交对表单进行校验的时候。使用:点击某按键时,提示全部字段是不是经过校验。 

$("#isAllValid").on("click", function(){
 alert($("#defaultForm").data('bootstrapValidator').isValid());
});

 7. resetForm(Boolean)

重新恢复设置表单中装置过校验的剧情,将躲藏全体错误提醒和Logo。
使用: 

$("#isAllValid").on("click", function(){
 alert($("#defaultForm").data('bootstrapValidator').isValid());
 if(!$("#defaultForm").data('bootstrapValidator').isValid()) {
 $("#defaultForm").data('bootstrapValidator').resetForm();
 }
});

 8. updateElementStatus($field, status, validatorName) 

立异成分状态。status的值有:NOT_VALIDATED, VALIDATING, INVALID or
VALID。 

9. updateStatus(field, status, validatorName)

履新钦命的字段状态。BootstrapValidator暗中认可在校验某些字段合法后不再重复校验,当调用别的插件可能措施或然会变动字段值时,须要重新对该字段进行校验。
使用:

点击开关对文本框举办赋值,并对其再度校验: 

$('#defaultForm').bootstrapValidator({
 fields: {
   username: {
 message: 'The username is not valid',
 validators: {
   notEmpty: {
  message: 'The username is required and can\'t be empty'
   }
 }
   },
   stringLength: {
 min: 6,
 max: 30,
 message: 'The username must be more than 6 and less than 30 characters long'
   }
 }
});

$("#setname").on("click", function(){
 $("input[name=username]").val('san');
 var bootstrapValidator = $("#defaultForm").data('bootstrapValidator');
 bootstrapValidator.updateStatus('username', 'NOT_VALIDATED').validateField('username'); 
 //错误提示信息变了
});

10. validate()

手动对表单举行校验,validate方法可用在急需点击开关也许链接而非提交对表单举行校验的时候。
由第三条可见,调用方式同样有二种: 

$(form).bootstrapValidator(options).bootstrapValidator('validate');

// or
$(form).bootstrapValidator(options);
$(form).data('bootstrapValidator').validate();

11. validateField(field) 

亚洲必赢官网,对点名的字段实行校验。

以上正是本文的全体内容,希望对大家的上学抱有协助,也盼望大家多多援救脚本之家。

你可能感兴趣的稿子:

  • JS组件Form表单验证神器BootstrapValidator
  • 基于jQuery
    完成bootstrapValidator下的大局验证
  • 实用又能够的BootstrapValidator表单验证插件
  • BootstrapValidator超详细教程(推荐)
  • Bootstrap中的表单验证插件bootstrapValidator使用办法整理(推荐)
  • jquery插件bootstrapValidator数据表明详解
  • Bootstrapvalidator校验、校验清除重新设置的贯彻代码(推荐)
  • jquery插件bootstrapValidator表单验证详解
  • BootstrapValidator不触发校验的贯彻代码
  • bootstrapValidator
    bootstrap-select验证不可用的消除办法
网站地图xml地图