AI实践哪家强?来 AICon, 解锁技术前沿,探寻产业新机! 了解详情
写点什么

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

评论

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

k8s自定义controller三部曲之一:创建CRD(Custom Resource Definition)

程序员欣宸

Kubernetes k8s 9月月更

玖章算术受邀参加红杉Talk「创新的复利」科技专场,共同探讨云计算的前世今生

数据库 数据复制 数据管理 数据备份 玖章算术

Predicate

急需上岸的小谢

9月月更

数据中心网络架构的需求原则及策略

阿泽🧸

数据中心 9月月更

跟着卷卷龙一起学Camera--黑电平Blacklevel

卷卷龙

ISP camera 9月月更

构筑校园  “云资环”助力精准防控

科技云未来

高级产品经理必备素养

产品海豚湾

产品经理 职业发展 商业化 9月月更 产品价值

程序员的摸鱼加速器!

Liam

程序员 前端 测试 后端 Postman

一文看懂Mysql锁

六月的雨在InfoQ

MySQL MySQL锁 9月月更 Mysql死锁 Mysql锁粒度

测试需求平台3-登录打通和产品列表功能实现

MegaQi

测试平台开发教程 9月月更

# 靠谱:开源IM项目OpenIM压测程序介绍-自己动手压测性能和稳定性

Geek_1ef48b

从用户到开发者是一种思维进化过程 | 访 StarRocks Committer 周威

StarRocks

leetcode 206. Reverse Linked List 反转链表(简单)

okokabcd

LeetCode 数据结构与算法

Web3的流支付代表Zebec,熊市布局的价值逻辑

鳄鱼视界

万物皆可集成系列:低代码对接企企云实现数据集成

葡萄城技术团队

Nacos 安装教程(史上最详细保姆级教程)

nacos SpringCloud 9月月更

Linux面试最高频的5个基本问题

千锋IT教育

新书上市 | 连载 5 年,千万读者追更,这本书讲透了通信背后的故事!

图灵社区

通信技术 科技史

关于链路追踪所需要了解的知识

穿过生命散发芬芳

链路追踪 9月月更

从零到一,教你搭建「CLIP 以文搜图」搜索服务(二):5 分钟实现原型原创

Zilliz

机器学习 深度学习 搜索引擎

基于 xbot 实现微信关键词自动回复

Hanson

微信 微信机器人 自动回复

数据可视化系列教程之组件构成

云智慧AIOps社区

前端 低代码 开源项目 数据可视化 可视化大屏

maven入门

楠羽

maven 笔记 9月月更

Web3大行其道,为何说Zebec值得投资人期待?

BlockChain先知

2022-09-01:字符串的 波动 定义为子字符串中出现次数 最多 的字符次数与出现次数 最少 的字符次数之差。 给你一个字符串 s ,它只包含小写英文字母。请你返回 s 里所有 子字符串的 最大波

福大大架构师每日一题

算法 rust语言 福大大

15款Python编辑器,你都使用过哪一款

千锋IT教育

华为云WeLink直播助力高校毕业典礼:这届毕业生,我们云上嗨

科技云未来

南阳蓝天燃气携手WeLink共创数字蓝天

科技云未来

高并发场景下,6种方案,保证缓存和数据库的最终一致性!

C++后台开发

数据库 缓存 高并发 后端开发 C++开发

深耕隐私计算技术,瓴羊DataTrust团队喜获殊荣

瓴羊企业智能服务

实践分享!GitLab CI/CD 快速入门

北京好雨科技有限公司

企业号九月金秋榜 Kuberetes

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