写点什么

链式语法与 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:52792

评论

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

图算法系列之计算图中最短路径

Silently9527

数据结构和算法 图算法 广度优先搜素

百度大脑开放日厦门站-企业服务专场报名

百度大脑

百度大脑 开放日 企业服务

414天前,我以为这是编程玄学...

why技术

Java JVM JMM

IM扫码登录技术专题(三):通俗易懂,IM扫码登录功能详细原理一篇就够

JackJiang

即时通讯 IM 扫码

想要做网页游戏怎么办 ?PixiJs 篇(三)

空城机

大前端 游戏 pixi 5月日更

GitHub开源的文言文编程语言、程序生成中国山水画、格律诗编辑程序

不脱发的程序猿

GitHub 开源 编程语言 传统文化

一线大厂最新总结Spring Security Oauth2.0认证授权全彩笔记

Java架构追梦

Java 阿里巴巴 架构 面试 spring security

一文带你全面了解java对象的序列化和反序列化

华为云开发者联盟

Java 序列化 java对象 反序列化 Serializable接口

JavaScript设计模式之单例模式

程序员海军

JavaScript 大前端 设计模式 单例模式

阿里大牛亲码 Spring AOP详解笔记全网开源,学透并发只需3天

飞飞JAva

spring aop

怎样使用过程自动化来实现过程的习惯性和持久性?

IPD产品研发管理

自动化 开发 CMMI

优柔寡断的人,能成什么大事

Kareza

个人成长 5月日更 反思总结

苹果移动设备用什么管理比较好?有什么推荐?

懒得勤快

imazing 手机管理

停止维护的CentOS6,怎么使用yum?

运维研习社

Linux 5月日更

10个 解放双手的 IDEA 插件,这些代码都不用写(第二弹)

程序员小富

Java 后端 IDEA

【技术干货】文件系统中的“锁”

焱融科技

容器 分布式 云原生 高性能 文件存储

读完你就知道对话式人工智能的数据采集如何解决啦!

澳鹏Appen

人工智能 自然语言处理 聊天机器人 nlp nlu

Nginx基础配置-资源缓存配置

梁龙先森

nginx 大前端 缓存;

缓存系统稳定性 - 架构师峰会演讲实录

万俊峰Kevin

缓存 微服务 分布式缓存 Go 语言

关于中台,聊聊我认为相对客观的三点认知

架构精进之路

中台 5月日更

STM32F103C8/BT6最小系统原理图、PCB

不脱发的程序猿

嵌入式 单片机 STM32F103C8T6 MCU ST

STM32如何计算RTC时钟异步预分频和同步预分频

不脱发的程序猿

嵌入式 RTC stm32 单片机 ST

打破思维定式(五)

Changing Lin

5月日更

【LeetCode】叶子相似的树Java题解

Albert

算法 LeetCode 5月日更

干好开发者关系的十个职业发展秘诀

开发者关系

开发者关系 技术运营 DevRel

Java程序员面试必备——过得了面试官,过不了HR?我教你

比伯

Java 编程 架构 程序人生 计算机

秘笈分享! 24 小时无人自习室为什么这么火?

IoT云工坊

小程序 人工智能 物联网 无人自习室

【智慧农业】从“看天吃饭”到“知天而作”,乡村振兴全靠 TA

IoT云工坊

人工智能 物联网 智慧农业 庭院灌溉 温室大棚

Python OOP-4

若尘

面向对象 oop Python编程 5月日更

青海大学智慧微能源数字孪生可视化系统

ThingJS数字孪生引擎

大前端 可视化 3D可视化 数字孪生

阿里P7:每个码农都应该知道的MySQL主从复制方法,看这篇就够了

牛哄哄的java大师

Java MySQL 数据库

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