入门 iOS 开发需要掌握的东西有三个:一门语言、一个系统 SDK 和一个开发工具

语言

严格来说可以直接与系统 SDK 交互的语言有两个,分别是从最初就一直用的 Objc 和新起之秀 Swift。编程语言本身是一个大领域,聚焦到 iOS 开发特别是入门 iOS 开发,只需要先掌握 Objc 的用法。

在入门阶段,特别是有一定其他语言编程经历的入门者其实很容易被误导,自己也很容易形成偏见,这可能是因为一方面囿于视野还不开阔,另一方面旧有的编程习惯收到冲击感到不适,所以常见有人诟病 Objc 语法奇怪、难学的言论。我觉得这是很可笑的,因为首先语言只是工具,常见的广泛应用于生产环境的工具没有高下之分,往往是各有优劣。其次我们使用一门语言来表达或者说实现业务逻辑,语法只是细枝末节的技能,只有熟练与不熟练之分,把自己不熟练转嫁到说语言本身不友善只能体现这个人本身的狭隘和偏见,如果让这种人去使用 scheme 这种前缀表达式语言同样要骂娘。总之 Objc 本身并没有大的问题。

那么就必须回答一个,如果 Objc 没有什么大问题为什么苹果要开发 Swift 并且强力推荐开发者们使用。苹果的态度是很明显的,swift 推出之后的 wwdc 基本上都是用 swift 来写各个主题的 demo。对于这个问题我觉得 Objc 之所以被 “抛弃” 不是因为本身有问题而是改进的空间不大或者说改进的难度很大。对于一个二十多年的老项目,因为历史的包袱和设计缺陷,更新难度大很容易理解。当更新的需要强于新开项目的成本时,选择新开一个项目创造一门新的语言就是理所当然的事情。采用 Swift 的好处对于第三方开发者来说其实都是一些表面的东西集中在编译前端:更多的编程范式带来更强的表达力;静态类型系统使程序更容易 debug 也更安全;更多的语法新特性 guard defer optional value generics 改进的 enum switch 等等可以避免许多低级错误。然而 swift 更重要的意义应该是在编译后端,给语言开发者一个全新更稳定的基础,在这个基础上可以火力全开地进行优化改进。所以 swift 的未来是光明的,但是眼下 objc 足够也可以很好的完成所有 iOS 平台上的开发需求。

回到 objc 本身,我学习 iOS 开发是从 Objc 语言开始的,学习一本叫做 programming in objective-c (6th) 的书。这本书内容非常多也非常少,多是因为非常厚有 499 页,少是因为覆盖的内容非常窄,仅限于语言本身仅仅在最后涉及到一点 iOS 平台开发相关的东西。讲解 Objc 可以划分为四个部分:数据、过程,类,其他功能,和其他大多数面向对象为主的语言应该是一样的。第一个部分数据乏善可陈,和 C 语言是一模一样的;第二部分过程包含了表达式和函数方法,大部分和 C 语言一样,不同的是 Objc 有类,Objc 特有的过程都是寄生于类的,过程在这门语言里不是第一类对象,这一点限制了过程和数据的融合,而过程和数据的融合是现代编程语言增强表达能力的关键。为了弥补这种缺陷所以有了 block,block 是一个异类它既是数据又是过程,但又不是数据也不是过程,它像数据一样定义像函数过程一样使用,和常见的闭包并不是同一回事,它是一个实现了闭包的异类。第三部分类和对象,面向对象这个部分本身是内容是很多的,但是在入门阶段需要了解的主要是面向对象可以实现的功能。第四部分是一些杂项,不过使用 c 语言功能,内存管理原则的解释,拷贝和序列化。

Objc 也有很多显然易见的缺陷,比如说 block 的多变语法 http://fuckingblocksyntax.com/ ,比如说闭包 block 和方法 method 的割裂使得没法轻松实现函数式表达,相比之下在 swift 中 function 就是一种特殊的 closure。没有完整实现范型支持,没有规则的使用 id 类型对 debug 和稳定性造成困扰。