iOS中Objective-C已死Swift当立?



序言

现在iOS开发者耳边一定有两个声音

  1. 还在用Objective-C不是都在用Swift了吗?
  2. Swift?大公司新项目都是在用Objective-C

所以小编写写自己的看法到底是Objective-C还是Swift

Swift 是一种新的编程语言,用于编写 iOS 和 OS X 应用。Swift 结合了 C 和 Objective-C 的优点并且不受C兼容性的限制。Swift 采用安全的编程模式并添加了很多新特性,这将使编程更简单,更灵活,也更有趣。Swift 是基于成熟而且倍受喜爱得 Cocoa 和 Cocoa Touch 框架,他的降临将重新定义软件开发。

Swift 的开发从很久之前就开始了。为了给 Swift 打好基础,苹果公司改进了编译器,调试器和框架结构。我们使用自动引用计数(Automatic Reference Counting, ARC)来简化内存管理。我们在 Foundation 和 Cocoa的基础上构建框架栈并将其标准化。Objective-C 本身支持块、集合语法和模块,所以框架可以轻松支持现代编程语言技术。正是得益于这些基础工作,我们现在才能发布这样一个用于未来苹果软件开发的新语言。

Objective-C 开发者对 Swift 并不会感到陌生。它采用了 Objective-C 的命名参数以及动态对象模型,可以无缝对接到现有的 Cocoa 框架,并且可以兼容 Objective-C 代码。在此基础之上,Swift 还有许多新特性并且支持过程式编程和面向对象编程。

Swfit和OC间的联系

1.Swift句尾不需要分号 ,除非你想在一行中写三行代码就加分号隔开。

2.Swift不要写main函数 ,程序默认从上往下执行

3.Swift不分.h和.m文件 ,一个类只有.swift一个文件

4.Swift不在有地址的概念

5.Swift数据类型都会自动判断 , 只区分变量var 和常量let

6.强制转换格式反过来了 OC强转:(int)a Swift强转:int(a)

7.整数的数据类型可以通过 .min和.max获得最大和最小值

8.定义类型的别名语法改变

OC:typedef int MyInt

Swift:typealias MyInt = int

9.Swift的模除取余运算符支持小数了 。 如 5%1.5 = 0.5

10.关于BOOL类型更加严格,Swift不再是OC的非0就是真,而是true才是真false才是假

11.与第10点相联系的就是,Swift的赋值运算符没有返回值 。防止误用“=”和“==”

12.Swift可以多对多赋值 。 let(x,y) = (1,2)

13.Swift的 循环语句中必须加{} 就算只有一行代码也必须要加

14.Swift的Switch语句后面以前只能跟整数, 现在可以跟各种数据类型了 ,如浮点字符串都行,并且里面不用写break,如果不想要没break的效果 即后面的都想执行 那就写上关键字 fallthrough(注意:在fallthrough后面就不能再定义常量变量了)

对比举例

1、初始化UIView的子类

在iOS应用上实现UI就需要子类化UIView,也就是要重写UIView的init方法。注意:两种语言有所区别。

Objective-C只需在UIView子类中重写必要的init方法。要初始化一个UIView框架,就要重写initWithFrame:框架,如下所示:

1
2
3
4
5
6
7
8
9
10
@implementation SubUIView
- (id) initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self != nil) {
        // ...
    }
    return self;
}
@end

然而Swift需要多一些步骤来重写同一个init方法。首先,重写使用CGRect框架作为其参数的init方法。根据UIView文档,用Swift语言构建时,须重写init( coder: ),但我们不需要这种方法,就用如下代码处理。类属性初始化所需的代码可以在init( frame: )中执行。

1
2
3
4
5
6
7
8
9
class SubUIView: UIView {
    override init(frame: CGRect) {
        super.init(frame: frame)
        // ...
    }
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

2、初始化UIViewController的子类

子类化UIViewController是iOS开发的重要步骤。使用Interface Builder的开发者需要重写initWithNibName:bundle:,但既然我们用代码来构建UI,就不需要执行这一方法了。只需重写init方法,在其中初始化类属性即可。

1
2
3
4
5
6
7
8
9
10
@implementation SubUIViewController
- (id) init
{
    self = [super init];
    if (self != nil) {
        // ...
    }
    return self;
}
@end

Swift也一样要重写init()方法。实现指定的初始化init(nibName:bundle: )来子类化UIViewController。重申:此过程不适用Interface Builder,所以无需定义nibName和bundle的值,而是调用比指定初始化更简单的convenience初始化,将指定初始化init(nibName:bundle: )设为零。现在调用init()来初始化类,用重写的(nibName:bundle: )执行类属性。

1
2
3
4
5
6
7
8
9
10
11
12
class SubUIViewController: UIViewController {
    convenience init() {
        self.init(nibName: nil, bundle: nil)
    }
    override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
        super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
        // Initialize properties of class
    }  
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}
1
2
3
//现在可以创建和调用UIViewController的子类
let viewController: SubUIViewController = SubUIViewController()
self.navigationController?.pushViewController(viewController, animated: false)

Swift有许多优点但一个iOS开发者,你仍然需要熟悉Objective-C

你不可以用Swift做任何事情。举个例子,如果你想在你的应用程序中使用一个C++库,你需要告诉Objective-C你使用C++的库。Swift可以调用C函数,但我相信如果你有很多C的函数和类型,你会想用Objective-C编程的。

Objective-C的社区论坛。在StackOverflow和iOS dev 博客中有成千上万的Objective-C的片段。Objective-C在过去的六年中被我们用来描述自己是怎么样去应用Cocoa Touth库工作的。如果你不能读Objective-C,你就不能理解这知识的宝库。

The frameworks 是用Objective-C编写的。当你有一个bug,它经常不露头直到执行到Apple‘s 代码的深处。如果你想理解调试器告诉你什么,你需要了解Objective-C。

Objective-C很稳定且测试良好的。Swift看起来很好,但是这个语言还在不断的发展中,并且编译器是不成熟的。如果今年我做出了一个重大的赌注去开发一个APP,我仍然会使用Objective-C

最后

不管选择Objective-C还是Swift,只要学习它并且精通它。最后你将发现,只要你学会iOS SDK,使用哪种语言并不是最重要的。并且精通一种语言之后可以很容易的开始学习另一门,最紧要的是,从现在就开始学习。

作者:_小迷糊
链接:https://www.jianshu.com/p/43c3a209d82

那么平时您开发时用哪种语言更多呢?


0