iOS中Objective-C已死Swift当立?
Posted Cocoa开发者社区
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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一个文件
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:框架,如下所示:
@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: )中执行。
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方法,在其中初始化类属性即可。
@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: )执行类属性。
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")
}
}
//现在可以创建和调用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/43c3a209d824
那么平时您开发时用哪种语言更多呢?欢迎在下面留言哦~
相关推荐:
以上是关于iOS中Objective-C已死Swift当立?的主要内容,如果未能解决你的问题,请参考以下文章
LSTM已死,Transformer当立(LSTM is dead. Long Live Transformers! ):下
NLP领域的ImageNet时代到来:词嵌入「已死」,语言模型当立
Objective-C/Swift (iOS) 啥时候在 View/ViewController 工作流程中应用自动约束?