写点什么

链式语法与 Objective-C

  • 2019-12-10
  • 本文字数:2881 字

    阅读完需:约 9 分钟

链式语法与 Objective-C

作为一个 Objective-C 语言的使用者已经有近两年的时间了. 在逐渐熟悉手中的工具, Objective-C 语言的同时, 我也开始从更高的角度来观察这一门语言.


虽然至今我也不敢说我精通 Objective-C 和 Cocoa Touch, 但是我对它们也有了一些自己的见解.

Objective-C

Objective-C 语言的语法使得我感觉到这门语言是如此的优雅. 在别人看来啰嗦的 label, 其实更是为了增加语言的可读性, 使 Objective-C 更像一门自然语言而做出的努力.


大多数的方法都不需要去查看文档, 只凭借方法的签名就能获得这个方法的作用, 这点使我们 iOS 开发者在编码的过程中更容易的达到代码即注释.


Objective-C


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;
复制代码


然而凡事都是有双面性, Objective-C 中一些重要框架的使用, 往往让人诟病.

Core Data

作为一名 iOS 开发者就会不可避免的接触到 Core Data 这个框架, 但是它的使用却一直被开发者吐槽, 主要是它的使用实在太过于复杂, 麻烦.


但是你有时却不得不使用它.


当然, 我在我所开发的应用中并没有过多的使用 Core Data, 而是使用了 levelDB 来代替, 这种 Key-Value 存储的数据库更适合于大部分的应用.

AutoLayout

在 AutoLayout 刚刚出现的时候, 许多的开发者都觉得 AutoLayout 必将快速将原来 iOS 开发中使用 frame 布局转变到使用 constraint 布局.


但是知道真正使用的时候才发现原来 AutoLayout 的使用方法是如此的繁琐.


Objective-C


[superview addConstraints:@[
//view1 constraints [NSLayoutConstraint constraintWithItem:view1 attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:superview attribute:NSLayoutAttributeTop multiplier:1.0 constant:padding.top],
[NSLayoutConstraint constraintWithItem:view1 attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:superview attribute:NSLayoutAttributeLeft multiplier:1.0 constant:padding.left],
[NSLayoutConstraint constraintWithItem:view1 attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:superview attribute:NSLayoutAttributeBottom multiplier:1.0 constant:-padding.bottom],
[NSLayoutConstraint constraintWithItem:view1 attribute:NSLayoutAttributeRight relatedBy:NSLayoutRelationEqual toItem:superview attribute:NSLayoutAttributeRight multiplier:1 constant:-padding.right],
]];
复制代码


使用这种方式来构建布局简直就是一种折磨, 这也是为什么在 AutoLayout 刚刚出现的时候, 并没有什么人去使用它. 反而, 真正使 AutoLayout 被开发者广泛使用的是另一个 DSL, 也就是大名鼎鼎的 Masonry.


它使用一种非常非常简洁的方式来实现自动布局.


Objective-C


[view1 mas_makeConstraints:^(MASConstraintMaker *make) {    make.top.equalTo(superview.mas_top).with.offset(padding.top); //with is an optional semantic filler    make.left.equalTo(superview.mas_left).with.offset(padding.left);    make.bottom.equalTo(superview.mas_bottom).with.offset(-padding.bottom);    make.right.equalTo(superview.mas_right).with.offset(-padding.right);}];
复制代码


其中最关键的一点就是使用了链式语法.


Objective-C


make.top.equalTo(superview.mas_top).with.offset(padding.top);
复制代码

Animation

在 Masonry 之后, 也就是前一段时间, 又有开发者为动画实现了同样简洁优雅的链式语法, 也就是 JHChainableAnimations.


在 JHChainableAnimations 作者的同意下, 我也同样将它移植到了 Swift 上 DKChainableAnimationKit.


这是使用 Objective-C 原有的方法实现的动画, 虽然它非常的易读, 并且符合 Objective-C 一贯的风格.


Objective-C


[UIView animateWithDuration:1.0                      delay:0.0     usingSpringWithDamping:0.8      initialSpringVelocity:1.0                    options:0 animations:^{                       CGPoint newPosition = self.myView.frame.origin;                       newPosition.x += 50;                       self.myView.frame.origin = newPosition;} completion:^(BOOL finished) {   [UIView animateWithDuration:0.5                         delay:0.0                       options:UIViewAnimationOptionCurveEaseIn                    animations:^{       self.myView.backgroundColor = [UIColor purpleColor];   } completion:nil];}];
复制代码


但是这段代码与下面的链式语法比起来就显得冗长与罗嗦了.


Objective-C


self.myView.moveX(50).spring.thenAfter(1.0).makeBackground([UIColor purpleColor]).easeIn.animate(0.5);
复制代码


虽然有人说, 这是对属性的误用, 不过在我看来与它带来的便捷, 优雅与易读相比, 属性的误用又算什么呢?


链式的语法能够极大的改变原有 Objective-C Swift 的使用, 而在这两者的启发下, 我也开始了各种各样的尝试.

UIKit

首先, 我在 UIKit 中进行了尝试, 希望能对原有的语法进行改造. 使用链式语法取代原有的语法. 这也就有了 ChainableKit 使用链式语法配置 UIKit 组件的第三方库.


Objective-C


UIColor *red = [UIColor redColor];UILabel.make    .backgroundColor(red)    .textAlignment(NSTextAlignmentCenter)
复制代码


但是, 当这一框架刚刚诞生并且我尝试写出之后, 我却感到有些怪异, 这好像并不符合我们的直觉, 因为这些属性并没有顺序上的关系. 但是却不失为一种尝试.


不过, 它也确实能够极大的减少代码的行数, 将配置 UILabel 的全部代码聚合在一起.

AttributedString

由于 colorize 的启发, 我又在 AttributedString 中尝试使用链式语法来解决创建配置属性字符串的问题. Typeset


Objective-C


@"Hello".typeset.match(@"He").red.string;
复制代码

总结

这就是我对链式语法在 Objective-C 中使用的总结和体会. 虽然并没有得出什么重要的结论, 不过我还是相信简洁与优雅的方法最终总会被开发者采纳.


本文转载自 Draveness 技术博客。


原文链接:https://draveness.me/lian-shi-yu-fa-yu-objective-c


2019-12-10 17:52783

评论

发布
暂无评论
发现更多内容

为什么使用中间件下载时总是收到警告消息Object is in status Wait

汪子熙

中间件 CRM SAP ERP

Mybatis获取自增长id

风翱

mybatis 5月日更

金融科技如何在产业互联网蓝海中扬帆远航?大数据、区块链与物联网应用被看好

CECBC

SAPGUI里实现自定义的语法检查

汪子熙

SAP abap SAPGUI 语法检查

如何在ubuntu上安装virtualbox的driver module vboxdrv

汪子熙

ubuntu 虚拟机 vboxdrv 驱动

利用CRM中间件Middleware从ERP下载Customer Material的常见错误

汪子熙

中间件 CRM SAP ERP

如何证明CRM WebClient UI上的应用是有状态(Stateful)的

汪子熙

CRM SAP abap WebClient UI

如何在Chrome development tool里查看C4C前台发送的未经 GZIP 压缩之前的请求细节

汪子熙

chrome SAP C4C Chrome开发者工具

数字货币兴起背后:全球货币超发 主权信用贬值

CECBC

观察者模式在One Order回调函数中的应用

汪子熙

CRM SAP abap

架构师训练营 作业四

开拓纪

如何从ERP将Material的Batch信息下载到CRM

汪子熙

CRM SAP ERP abap

CRM product UI里assignment block的显示隐藏逻辑

汪子熙

CRM SAP abap

如何从ERP下载Sales BOM到CRM

汪子熙

CRM SAP ERP abap

如何检查某个用户是否具有某个权限对象上定义的某种权限

汪子熙

CRM ERP abap Authorization Authentication

在浏览器里使用SAPGUI里的SE80

汪子熙

JavaScript SAP abap Fiori SAP UI5

架构实战营 - 模块四作业

Sun

如何快速的学习一门新的编程语言?

架构精进之路

学习 5月日更

高性能 JavaScriptの六 -- 老生常谈Ajax

空城机

JavaScript ajax 大前端 5月日更

CRM中间件里的发布-订阅者模式

汪子熙

CRM SAP ERP abap

One Order行项目里Item Category是怎么计算出来的

汪子熙

CRM SAP abap ONE-ORDER

如何用ABAP代码读取CDS view association的数据

汪子熙

CDS SAP abap CDS view

设计千万级学生管理系统的考试试卷存储方案

俞嘉彬

ABAP git客户端的简单介绍

汪子熙

GitHub SAP abap

CRM和ERP的Sales Organization的映射关系

汪子熙

中间件 CRM SAP ERP

架构训练营-模块四作业

冬天的树

CRM订单状态的Open, In process和Completed这些条目是从哪里来的

汪子熙

CRM SAP ERP abap

ABAP和Java里关于DEFAULT(默认)机制的一些语言特性

汪子熙

SAP abap Netweaver SAPGUI

如何使用腾讯云提供的云主机

汪子熙

腾讯云 云主机 Cloud

ABAP OPEN SQL里OPEN CURSOR和SELECT的比较

汪子熙

CRM SAP abap ST05 OPENSQL

如何使用代码获得一个function module的Where Used List

汪子熙

CRM SAP abap SAPGUI

链式语法与 Objective-C_文化 & 方法_Draveness_InfoQ精选文章