Swift和Objective-C的区别和联系



一、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方法的时候有提示四个形参的含义,但写完后,鬼知道这句代码中10, 20, 100, 500是啥意思(我是举了个简单的例子,不要因此怀疑我的智商!)?所以代码的可读性就变的很差, 而objective-c很完美的解决了这个问题 : [ rect setX:10 y:20 width:100 height:500 ]看看!多棒!swift当然不会丢弃这么好的传统, 在swift中是这个样子的 rect.set( x:10, y:20, width:100, height:500 )看看!!!完美吧!

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

?
1
2
3
4
5
6
7
8
9
10
11
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中都有问题,举个栗子:

?
1
2
3
4
5
6
7
@interface Weapon
-( void )shoot;
@end
 
@interface Gun : Weapon
-( void )Shoot;
@end

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

?
1
2
override func shoot{
}

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值