有了Swift,iOS开发者为何仍需掌握Objective-C?

jopen 10年前

        我记得很清楚,在 WWDC 2014 大会上,Apple 第一次宣布了一个为 iOS 准备的叫做 Swift 的新的编程语言。估计当时的参会者大多数都会有这样的想法在大脑里闪过:

  • 等等,这是虾米?
  • 天啊,我一直喜爱 Objective-C,但现在开始要学习一个新的语言了?
  • 这是为 iOS 8 构建 App 的唯一方式?

        之前有人问过这样的问题:对于初学者,Objective-C 和 Swift,你推荐先学哪一个?

        真正从长远角度来看,学习 Objective-C 还是 Swift 语言其实很不重要。

有了Swift,iOS开发者为何仍需掌握Objective-C?

        Swift 刚发布的时候有人说“这下所有人都回到零起点了”,实际上是外行的一个常见的误解。Swift / Objective-C 和 iOS 开发是两个不同的概念,前者仅仅是一门编程语言,而后者则包括了编程思想、Cocoa 框架的使用,甚至交互设计规范、界面设计规范等 iOS 开发所需的一整套东西,并且绝大部分是和语言无关的。从学习的角度看,大部分时间你将花在学习后者上,而具体语言和语法只占很小的比例。 Objective-C 和 Swift 虽然语法上差异很大,但是背后的思想以及所依托的类库都是相同的。关于 iOS 应用开发你能想到的绝大多数问题,例如:

  • 一个应用的代码是从哪里开始执行的?
  • 如何建立一个按钮,并实现用户点击这个按钮之后调用一个函数?
  • 如何修改一个标签的文字?
  • 如何控制系统发出声音或者播放视频?
  • 如何检测设备的朝向?

        它们的答案都取决于 Cocoa 框架如何使用,而非具体采用的语言是什么——你关注的应该是背后的“我该做什么,为什么要这么做”,而不是简单的“具体怎么去写”——不同语言仅仅是一个写法不同而已,手册和网络上都可以查到,用多了自然掌握。

        因此,对于一个已经掌握了 Objective-C 和 iOS 开发的人,迁移到 Swift 是几天就可以搞定的;而对于一个掌握了 Swift 和 iOS 开发的人,迁移到 Objective-C 也不会很困难。

        至于选择哪个语言,我想说 Swift 代替 Objective-C 肯定是有原因的,必须承认 Objective-C 的很多语法的确很怪很繁杂(Objective-C 的啰嗦是出了名的),可能对编程语言的初学者不太友好,Swift 接受起来会稍微容易一些。但另一个事实是,目前 Swift 的文档、教程和代码还比较少,并且大部分都是关于语法的。虽然有一两个官方文档是关于如何从 Objective-C 切换到 Swift 的,也有一些 Swift 的示例代码,但和 iOS 开发这个庞大的体系比起来,覆盖面仍然很窄。这对于已经掌握 Objective-C 的开发者不是问题,但是对于什么都不会的初学者,看过 Swift 的文档之后能写一个类似 C 的控制台应用程序出来,但是很难写一个你自己想要的完整可用的 iOS App 出来。因此,基于你的情况,我还是倾向于推荐从 Objective-C 开始学起。

        有 Objective-C 开发经验的开发者说

        Apple 很快就将大部分的开发者聚集到一起,正如它很绅士的向大家介绍 Swift 并回答所有疑问那样。Apple 向外承诺说,iOS 开发者使用 Swift 一定能从一个现代语言里获得很多好处,包括像强类型化、类型推理、通用术语等等。这些功能都是 Objective-C 开发者一直感兴趣的东西,但是有学习 Swift 编程语言需要花多少时间精力?

有了Swift,iOS开发者为何仍需掌握Objective-C?

        学习一个新的编程语言当然不会吓到任何一个 Objective-C 开发者,但也并是说 Swift 里面的所有新的功能都很有吸引力的,更何况,Objective-C 在 2008 年 3 月 6 号就开始被用来构建 iPhone OS 里的移动 App 了。

        上面所说到的都是有经验的开发者,那么对于没有 Objective-C 开发经验的开发者来说,他们对这个新的编程语言是什么态度呢?

  • 真走运,可以避开 Objective-C 的折磨了。
  • 只是一个 .swift 文件,没有标题或实现文件!太棒了!
  • 插入语的山寨版大全终于要出来了。

        这些新手也许话里话外都是在谈论 Swift,最关键的是他们都很庆幸 Swift 终于可以在不久的将来完全替代相对复杂难懂的 Objective-C 了。

        Swift 开发者说

        下面这些是多维数组的 Objective-C 代码片段,用 Xcode 输出窗口展示出来的数值:

#import <Foundation/Foundation.h>int main ()  {   /* an array with 5 rows and 2 columns*/ int a[5][2]-{{0,0},{1,2},{2,4},{3,6},{4,8}};   int i,j;      /* output each array element's value*/ for(i=0;i<5;i++)   {     for(j=0;j<2;j++)      {         NSLOG (@"a[%d][%d]=%d\n",i,j,a[i][j]);       }       return 0;    }  }

        输出的结果是:

  • a[0][0] = 0
  • a[0][1] = 0
  • a[1][0] = 1
  • a[1][1] = 2
  • a[2][0] = 2
  • a[2][1] = 4
  • a[3][0] = 3
  • a[3][1] = 6
  • a[4][0] = 4
  • a[4][1] = 8

        不知道你有没有看到什么熟悉的东西,‘i’ 和 ‘j’ 代表的含义,还有循环。但是接下来的 ‘a’ 代表什么,或者 NSLog 是什么样的语法?估计没人想要写这样的代码,不管我们想要得到什么,至少这就是我们暂时想要看到的。

        Swift 发布之后,我为什么还要学习 Objective-C?

        要想回答这个问题,就得先解决这些问题。调试一个麻烦的 bug。

        你之前有在任何移动商店构建和发布过 App 吗?如果有的话,你肯定在开发过程中遇到过较为严重的 bug 吧。反正我是遇到过的,大多数 bug 都是比较难缠的。无论你使用的是 Swift 还是 Objective-C 来编写 App,底层框架都是用 Objective-C 写的。缺陷深度的执行堆栈需要超过知识迅速的语言。要是在执行栈里遇到 bug 的话,必须对 Swift 语言相当了解才能将其解决。

        我之前就用 Swift 编写过一个 App,同时遇到了一个用于显示数据的 TableView 上出现的问题,虽说这是一个不太复杂的问题,可是在我做了“优秀开发者”做的解决方案之后,还是没办法解决。然后在 Google 上寻找答案,虽然方法有很多,但是都只支持 Objective-C 代码。不知道要多久才能出现包括 Swift 在内的解决方案?但是我们知道目前的开发者社区里 Objective-C 是通用语言。

        iOS 开发者社区的通用语言是 Objective-C

        历史告诉我们,过渡是需要时间的。然而这个过渡时间需要多长,谁都说不准!在自动引用计数(ARC)发布之前,当看到‘release’和‘retain’的时候都会畏缩一阵子。在 Apple 发布一个过渡指导之后,开发者开始代替使用手动引用计数。

        AutoLayout 怎么样?很多开发这一开始的时候抱着试试看的态度使用,结果并没有达到自己想要的效果,所以他们只能放弃,“等到下一个 Xcode 版本出来的时候再试试吧!”

        Demo Code != Production Code

        在 WWDC keynote 上面我们看到 Swift 的运行速度很快,但真的有那么快吗?之后在各个博客页上和 StackOverflow 出现了对比,用 Swift 构建各种产品。在现实情况下用 Swift 创建 App 的时候,其表现和 Objective-C 有哪些区别呢?随着时间的推移,Swift 可能会更快,但我没那么多时间去等。

        Swift 一直在不断的改进

        Swift 知道自己的目标,但是没什么可以击败自己老大哥 Objective-C 这么多年的经验。如果你想要添加 C++ 代码到一个 iOS App 里面,你还得了解 Objective-C。

来自: CSDN