注册 登录
主题 : swift对比objective-c( 系列一 )。
级别: 新手上路
UID: 84110
精华: 0
发帖: 20
可可豆: 121 CB
威望: 101 点
在线时间: 93(时)
注册时间: 2011-07-29
最后登录: 2018-04-19
0 楼:  发表于: 2014-06-03 12:30    发自: Web Page
来源于 Swift教程 分类

swift对比objective-c( 系列一 )。   

管理提醒: 本帖被 gagaga 执行加亮操作(2014-06-03)
WWDC 2014上苹果再次惊世骇俗的推出了新的编程语言SWIFT( 雨燕 ), 这个消息会前没有半点风声的走漏。消息发布当时,会场一片惊呼,相信全球看直播的码农们当时也感觉脑袋被敲了一记闷棍吧( 至少我当时是这样的,连喊三声:“卧槽,妈蛋” )。于是熬夜学习了SWIFT大法,越看越想高呼 ” SWIFT大法好!

个人愚见:swift语言替代objective-c只是时间问题( 这个时间不会太长 )---扬起大脸迎接喷子们

空说无凭,程序员,最讲究的就是实事求是和客观,下面就开始对比两种语言。
首先要强调的是,swift绝对不是解释性语言,更不是脚本语言,它和objective-c,c++一样,编译器最终会把它翻译成C语言,也就是说编译器最终面对的其实都是C语言代码( 这是千真万确,不容置疑的!!!所以不要看它长的想脚本语言,其实它是比java, c#要高效的多的c语言!!!),但是swift的强大之处在于它站在所有语言的肩膀上,吸取所有语言的精华。

这个系列我们先谈谈几个最基本的语法变化
《一》swift终于放弃了objective-c那幺蛾子般的 [ obj method:x1 with:x2] 的语法,终于跟随了大流,变成了obj.method( )的顺眼模式。虽然对于objective-c的程序员来说,这些[ ]看上去特显酷 , 你们知道就是这个中括弧吓跑了多少c++, java , c#的程序员嘛?所以说这个小小的变化,可以让苹果的开发更平易近人,对有其他开发语言基础的人来说更友好。

   但苹果不会这么自甘平庸,我们知道objective-c里方法的调用有种语法是其他主流语言没有的,那就是标签。我们在使用java, c++, c, c#等语言时,如果使用 rect.set( 10, 20, 100, 500 ), 虽然在写set方法的时候,IDE有提示四个形参的含义,但写完后,鬼知道这句代码中10, 20, 100, 500是啥意思?(我是举了个简单的例子,不要因此怀疑我的智商!)。所以代码的可读性就变的很差, 而objective-c很完美的解决了这个问题 :
  [ rect setX:10 y:20 width:100 height:500 ]
看看!多棒!swift当然不会丢弃这么好的传统, 在swift中是这个样子的
 rect.set( 10, y:20, width:100, height:500 )看看!!!完美吧!
对于调用方法时,标签的使用需要注意以下两点:
1;)全局函数的调用,不可以使用标签
fun( 11, 22 , 33 ) //正确✅
 fun( n1:11, n2: 22, n3: 33 ) //错误❌


2:  ) 类的函数,第一个参数不可以加标签 。
rect.set( 100, y:100, width:300, height: 200 ) //正确✅
rect.set( x:100, y:100, width:300, height: 200 ) //错误❌



其实swift中对类的定义和java, c#几乎一样,再也不分头文件和.m文件了。
一个类的定义语法如下:


class Weapon
{
    var name:NSString
    var power:int
    init( name:NSString, power:int )
    {
        self.name = name
        self.power = power
    }
    func shoot( )
}

注意:swift中的语句不需要分号结束( swift在吸引幼齿入swift大法方面无不用其极!)
其次,终于有构造函数和析构函数了!!!objective-c也有?no no no!!!objective-c中才没有构造函数,真正的构造函数是系统自动调用的,而不是强迫程序员去调用。以前要强迫程序员[ [ Obj alloc ] init ], 傻哇? 如果程序员比较笨比较呆忘记写init咋办? 现在终于终于终于系统自动调用了!!!
Weapon weapon = Weapon( name:“人间大炮”, power: 100000000000 )
我才没有写错, 对的!现在和java, c#一样!虽然weapon是一个指针,但不要写那颗星号!!因为这颗星号吓死过好多人!“ 啥?指针?!!啊。。。。。”(吓死了)
c, c++的程序员注意了,这个weapon对象不是分配在栈内存上的, 仍然是alloc出来的, 在堆上呢。


《二》最期待的语法终于加入了!
对于override在java,c++,objective-c中都有问题,举个栗子:

@interface Weapon
-(void)shoot;
@end

@interface Gun : Weapon
-(void)Shoot;
@end

在大项目中经常会遇到这个问题,程序员的本意是希望覆盖父类的shoot ,结果手潮。。。。写成了Shoot , 这既没有语法错误,也没有逻辑错误,结果在
Weapon*  currentWeapon = [ Gun new ];
[currentWeapon shoot ] 中调用的却是父类的shoot方法( 因为子类根本没有覆盖啦,子类大小写不小心写错了 ), 这种小错误如果出现在超大型项目种还真是很难找呢!!现在,swift终于解决这个问题啦! 子类覆盖父类方法的时候,一定要在方法前写上override

override func shoot{
}

这样,编译器一看方法前写了override, 它就会在父类中去查找是否有shoot方法, 如果你写错成override func Shoot, 那编译器就立刻能发现报错啦!

----晚上再写, 不要逼我太紧好吗-------
[ 此帖被xu54在2014-06-05 11:15重新编辑 ]

清空我的评分动态本帖最近评分记录: 共1条评分记录
gagaga 可可豆 +5 2014-06-03 -
隐藏评分记录
级别: 新手上路
状态: 连续签到 - [2天]
UID: 293916
精华: 0
发帖: 9
可可豆: 48 CB
威望: 18 点
在线时间: 7(时)
注册时间: 2014-02-21
最后登录: 2017-05-13
1 楼:  发表于: 2014-06-03 12:37    发自: Web Page
沙发,同样钻研Swift中~
级别: 新手上路
UID: 313279
精华: 0
发帖: 3
可可豆: 12 CB
威望: 12 点
在线时间: 13(时)
注册时间: 2014-05-06
最后登录: 2015-10-21
2 楼:  发表于: 2014-06-03 12:40    发自: Web Page
mark一下 - - 根据苹果的尿性 转战SWIFT是必然的。。。
级别: 精灵王

UID: 14920
精华: 0
发帖: 1387
可可豆: 8737 CB
威望: 8733 点
在线时间: 2106(时)
注册时间: 2010-03-06
最后登录: 2018-04-17
3 楼:  发表于: 2014-06-03 12:42    发自: Web Page
确实有当头一闷棍的感觉,不过看到它的执行效率比objective-c还高数倍时,惊呆了,这玩意绝对要埋葬苹果自己的objective-c,因为都是苹果自己的东西,都不用考虑跨平台,有一个就够了。
搞3D的还有一闷棍,苹果用自己专门为A7处理器做的Metal 3D埋葬了OpenGL,以前学的OpenGL知识又要归零了。
现在有一种什么也不会的感觉。
级别: *
UID: 240768
精华: *
发帖: *
可可豆: * CB
威望: * 点
在线时间: (时)
注册时间: *
最后登录: *
4 楼:  发表于: 2014-06-03 12:49    发自: Web Page
楼主说到心里去了,曾经是准备学objectc的,一看到那复杂的符合就没信心了,现在好了
级别: 侠客
状态: 连续签到 - [1天]
UID: 29204
精华: 0
发帖: 140
可可豆: 1096 CB
威望: 1095 点
在线时间: 165(时)
注册时间: 2010-08-31
最后登录: 2016-12-19
5 楼:  发表于: 2014-06-03 12:57    发自: Web Page
我一直没有做ios开发,就是因为oc那幺蛾语法~
级别: 新手上路
状态: 连续签到 - [1天]
UID: 320614
精华: 0
发帖: 12
可可豆: 9 CB
威望: 4 点
在线时间: 3(时)
注册时间: 2014-06-03
最后登录: 2014-06-03
6 楼:  发表于: 2014-06-03 13:02    发自: Web Page
swift    加油啊
Swift开发者/swift编程 212504174
级别: 新手上路
UID: 8981
精华: 0
发帖: 35
可可豆: 62 CB
威望: 63 点
在线时间: 1205(时)
注册时间: 2009-09-21
最后登录: 2018-02-12
7 楼:  发表于: 2014-06-03 13:08    发自: Web Page
加油,swift超爽啊
这段操作符重载的代码

“@infix func == (left: Vector2D, right: Vector2D) -> Bool {
    return (left.x == right.x) && (left.y == right.y)
}
@infix func != (left: Vector2D, right: Vector2D) -> Bool {
    return !(left == right)
}”

摘录来自: Apple Inc. “The Swift Programming Language”。 iBooks. https://itunes.apple.com/WebObjects/MZStore.woa/wa/viewBook?id=881256329

以后比较CGPoint a,b;
只要 a==b 或 a!=b
再也不用写 a.x==b.xx && a.y==b.y
Matrix
级别: 新手上路
UID: 228754
精华: 0
发帖: 3
可可豆: 43 CB
威望: 3 点
在线时间: 57(时)
注册时间: 2013-06-19
最后登录: 2017-09-26
8 楼:  发表于: 2014-06-03 13:10    发自: Web Page
有种重头再来的赶脚
级别: 新手上路
UID: 298239
精华: 0
发帖: 1
可可豆: 1 CB
威望: 1 点
在线时间: 15(时)
注册时间: 2014-03-08
最后登录: 2015-05-06
9 楼:  发表于: 2014-06-03 13:21    发自: Web Page
卧槽,妈蛋!唉,熬夜吧~~...
描述
快速回复

关注本帖(如果有新回复会站内信通知您)

发帖、回帖都会得到可观的积分奖励。查看论坛积分规则

按"Ctrl+Enter"直接提交
    顶部