Skip to content

这是objc的链式编程框架,旨在保护编码时易被干扰的注意力//LinkBlock(objective-c ) , to chain programming. Like "viewFrame(10,10,30,30).viewAddTo(self.view).nslog()... ".Just for coding quickly!

License

Notifications You must be signed in to change notification settings

BillHai/LinkBlock

 
 

Repository files navigation

#LinkBlock LinkBlock icon

What is this?

  • 这是一个objc扩展集合链式编程,为的是告别换行和中括号,避免多余的干扰,让我们可以专注于编码的逻辑。
  • 提炼Fundation最基本功能和最常见功能的写法。
  • 持续更新
  • This is objective-c link block , to chain programming.
  • Frame encapsulation of native Foundation is the most basic and the most common functions...
  • Continuously updated ##Simple to use LinkBlock ;
LinkBlock.h

##CGRectMake()不友好

//Such written before 
//手绘UI常要创建4,5个变量
UIButtonNew
.viewAddToView(self.view)
.btnTitle(@"Button", UIControlStateNormal)
.btnTitleColor([UIColor lightGrayColor],UIControlStateNormal)
.viewBGColor(@"f0f0f0".strToUIColorFromHexStr())
.frame= @"{{20,20},{150,80}}".strToCGRect();

##使用链式的方式完成一件事情

//如果使用链式编程的方式,大部分工作可以在思路连续的情况下进行
//now just using one line.Most work can be wrapped up in the idea of ​​ongoing cases
btn.viewSetFrame(20,20,150,80).viewBGColor(@"0xff22cc".strToColorFromHexStr())
.viewAddToView(self.view).btnTitle(@"click change color", UIControlStateNormal);

##一些样例

//去空格和换行,并打印
//去空格和换行,并打印
@" 五 千 年 的 风 和 雨 啊 \r\n 唱 了 多 少 萌 ".strClearSpaceAndWrap().nslog();
//字符串比较大小
@"123".strCompare(@"111");
//对数字敏感的字符串比较
@"abc1.txt".strCompareNumberSensitive(@"abc2.txt");

//查找最大数
@"[12,43,534]".strToNSArrary(NSUTF8StringEncoding).arrMaxNumber().nslogTitle(@"最大数是:\n");

//创建属性字典
AttrDictNew.makeAttrDictFont([UIFont systemFontOfSize:15]).makeAttrDictTextColor([UIColor blackColor]);

//添加一个标签到视图上,并且文本顶部对齐,中间对齐
UILabelNew
.labText(@"中间对齐顶部对齐")
.viewSetFrame(20,200,150,80)
.labNumberOfLines(0).labAlignment(NSTextAlignmentCenter).labAlignTop()
.viewAddToView(self.view)
.viewBGColor(@"#f0f0f0".strToUIColorFromHexStr());

//字符串常量直接转颜色
@"0xff22cc".strToColorFromHexStr();

//正则表达式替换_xxx_为[xxx]
@"name=_boom_".strRegexReplace(@"(_)(\\w+)(_)" , @"[$2]").nslog();
//正则表达式验证是否为邮箱
@"[email protected]".strRegexIsMatch(@"^[a-z0-9]+([._\\-]*[a-z0-9])*@([a-z0-9]+[-a-z0-9]*
[a-z0-9]+.){1,63}[a-z0-9]+$") ? @"YES email".nslog() : @"NO email".nslog();


//数组过滤
NSArray* arrForFilter = @[ @{@"name":@"ali", @"age":@(123)} ,
                            @{@"name":@"bli", @"age":@(0)}   ,
                            @{@"name":@"cli", @"age":@(12)}  ,
                            @{@"name":@"dli", @"age":@(-45)}  ];

//过滤age<0的数据
arrForFilter.arrFilter(@"age<0").nslog();

//过滤age<100 并且 age>-1 的数据
[arrForFilter arrEnumerateWithPredicateFormat:@"age>-1 and age<100"
    usingBlock:^(NSObject* obj, NSUInteger idx, BOOL *stop) {
    obj.nslog();
}];

##对字典的操作

//替换字典中的键
NSDictionary* 需要替换的字典 = @{
                                @"description":@"123",
                                @"dict":@{
                                            @"description":@"123",
                                            @"arr":@[
                                                        @{
                                                            @"dict2":@{
                                                                @"description":@"123"
                                                            }
                                                        },
                                                    @{
                                                        @"description":@"123123"
                                                    },
                                                    @"adf"
                                                    ]
                                        }
                            };
需要替换的字典 = 需要替换的字典.dictReplaceKey(@"description", @"DESCRIPTION");
NSLog(@"%@",需要替换的字典);

##SQL拼接的易读和易查错

//高效阅读的sql编码方式,易查错,易修改
BOOL sex = NO;
NSString* sql0 =
[[[SQLNew SQLSelect:^(NSMutableString *makeSQL) {

    [makeSQL SQLIf:sex==0 using:^(NSMutableString *makeSQL) {

        makeSQL.SQLStr(@"*");
    } elseUsing:^(NSMutableString *makeSQL) {

        makeSQL.SQLArr(@[@"id",@"name",@"age",@"sex",@"nickName",@"address",@"point"]);
    }];
}] SQLFrom:^(NSMutableString *makeSQL) {

    makeSQL.SQLArr(@[@"Student" , @"Teacher", @"Foods"]);
}] SQLWhere:^(NSMutableString *makeSQL) {
    
    makeSQL.SQLStr( @"id =").SQLIntInStr(1000);
}];
NSLog(@"%@", sql0);

NSString* sql1 = 
[[SQLNew SQLCreate:^(NSMutableString *makeSQL) {

    makeSQL.SQLStr(@"table if not exists");
}].SQLStr(@"Person") SQLValues:^(NSMutableString *makeSQL) {

    makeSQL.SQLStr(@"id integer primary key").SQL_Comma();
    makeSQL.SQLStr(@"name text").SQL_Comma();
    makeSQL.SQLStr(@"sex integer").SQL_Comma();
    makeSQL.SQLStr(@"address text");
}];
NSLog(@"%@", sql1);

##end()

//想在链条结尾获取绝对真实的对象值(继承NSObject)需要在最后使用end()
//因为可能得到的是LinkError对象
//If you want get real type of vale.you should using 'end()' at chain end.
//Because you may get LinkError
NSString *str2 = str1.strAppend(str0).strAt(15).end();

##LinkError

  • 由于objc是有弱类型语言特征的语言,block是作为了扩展的属性,才可以被'.'出来。当中间一个链条返回的对象是nil,或者非预期的类型,那么下一根链条就会断裂,报错。为了让链条能够在安全的情况下容错走通,那么引入一个新的单例的类型LinkError 。这个对象响应所有扩展属性的调用,功能仅仅返回自己到下一根链条以供传递。所以end()方法的使用对于获取链条末尾的返回值至关重要。
  • LinkError can respond to all extension property,it just return self to next chain.And not break,not throw an exception.

##关于

  • 这并不是一个功能型框架,控件框架,没有整体架构。完成它仅仅是作者为了偷懒又考虑到和自己一样的人,将考虑过的功能加入其中,而不是任何API都塞进去。初衷维护编码时集中的注意力不被分散。
  • 并不推荐大量使用链式的编码方式,因为这样也会影响阅读。希望的方式是画龙点睛,例如在写了很多行后一组缜密的逻辑中,突然要创建一堆变量和判断要不然就要新写方法的时候。如上所述假如这种功能很常见,那么作者就会将其抽出。
  • 目前xcode还没能给block有尚好的参数提示,所以使用起来还是略微不便,需要去头文件查看参数。作者也将参数名赋予准确的意义。

##Bug-mail address,join us address  *[[email protected]]([email protected])*
##希望大家都支持链式编程这种编程方式
* 一朝做鸟程序员

About

这是objc的链式编程框架,旨在保护编码时易被干扰的注意力//LinkBlock(objective-c ) , to chain programming. Like "viewFrame(10,10,30,30).viewAddTo(self.view).nslog()... ".Just for coding quickly!

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages

  • Objective-C 99.8%
  • Ruby 0.2%