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

swift对比objective-c( 系列二 )--下午更新完毕   

管理提醒: 本帖被 aaronglyang 执行加亮操作(2014-06-04)
系列一发表后,有很多马仔不同意我的关于 #swift会取代objective-c#的论点,在这里我想强调两点

1:)swift其实就是objective-c的文本变种,对于这门全新的语言,苹果做的工作其实远没有我们想像的艰巨。LLVM编译器做工作只是先把swift翻译成objctive-c代码,然后再把objective-c代码翻译成c语言代码,然后再把c语言代码翻译成汇编,最终翻译成机器码。至于为什么编译器厂商这么绕,不直接把自己的语言翻译成汇编和机器码,那是由于现有的语言编译器(objective-c, c )已经非常成熟,而高级语言间的文本转换开发成本和维护成本都极其小。swift为什么要翻译成objective-c,是由于swift仍然需要objective-c中辛苦构建的ARC,GCD 等环境。

2:)既然swift代码最终会被LLVM翻译成objective-c, 那swift语言还有什么意义?想想ARC刚出来的时候大家的反应吧,很多人和今天的反应一样,认为我是资深的objective-c马仔了,我深谙内存管理之道,不停的写[ obj release ], [ obj autoRelease] 很牛,只有那些初学者才会用ARC呢。结果就是不到一年,ARC统治了整个马仔界,因为我们马仔关注的应该是业务逻辑,而不应该把精力分散在语法等低级问题上,语法消耗我们的时间越少,这门语言就越成功。

既然swift其实就是objective-c, 对入门者而言远比objective-c好学,对资深开发者来说又能节约很多无谓的低级重复的机械代码(这些代码在LLVM翻译成objective-c时,编译器自动帮你写上)。我是想不出任何一点swift不替换objective-c的理由呢。

好吧,争论放置一边不表,我们从头来看swift到底进化到什么程度。

-------大法之初,无为乃大--------
1:)语句不需要分号结束,变量如果有初始化就不需要类型
var n = 22
对于编译器而言,既然你都初始化为22了,它当然明白n是int , 你都打回车了, 它当然知道这是语句的结束,所以LLVM毫无压力的把它翻译成
int n = 22;

当然对于多个语句放一行,那编译器就没有办法了, 你还是要用分号来结束语句。如果没有初始化,你也可以手工指定变量类型
var n = 22; var hero:Hero

所以看上去是无类型变量,实质上还是强类型的( 编译器给你做了 )
如果是常量的话, 用let
let PI = 3.1415926
这里的PI 就是常量, 现在想想,以前的强类型高级语言真是傻到无语啊,let PI = 3.1415926 , PI  都这么明显是个double, 为啥还要程序员再写double ?! 玩我呢??!

2:)函数的定义
func test( p1: Int32, p2: Int32 )
{
}


调用: test( 25 , 100 ) //注意:全局函数的调用,参数不能加标签

如果有返回值, 返回类型用符号 “ -> ” 表示
func  add( p1: Int32, p2 : Int32 )->Int32
{
    return p1+p2
}



3:)类的定义
不再分头文件和m文件了!这点和java, c#一模一样
class Person
{
    var    name:String
    var    age = 0
    init( name:String , age:Int32 )
    {
        self.name = name;
        self.age = age;
    }
    func description( )->String
    {
        return “Name:\( self.name ) ; Age: \( age )”;
    }
}


注意终于有构造函数了!!init 是系统自动调用的, 不需要程序员手工调用。所以它写起来和普通函数也有区别,前边不能加func。 编译器为什么要这样做?因为如果init也允许前面加上func, 万一程序员不小心把init函数名写错了, 写成func Inot( ),编译器就完全不知道它是程序员想写的构造函数。现在构造函数前不加func , 如果你写成Inot( ) 。 编译器一看前面没有func知道你要写构造,可函数名又不是init, 编译器就知道你不小心写错了就可以立刻报错啦!!


2: )#可选变量# ---所有高级语言一开始就遇到的难题
比如客户需要提供一个最终的API, 客户给你一个数据源, 需要在数据源里找到名字是“jack.xu”的学员成绩。这个api的设计应该是这样的:
int FindScoreByName( DataSource*  source, string* name );

问题来了,如果“jack.xu”的学员根本不存在,应该返回啥? 返回0?那肯定不对,因为0有可能也是学员的成绩。当然,如果返回的是类的对象,直接返回 NULL , 调用者就知道没有找到,现在是基本数据类型,返回NULL 其实就是0,怎么办?(在c,c++中的规范做法是 返回bool表示是否找到,而成绩通过形参来传递 ,其他高级语言中可以封装一个小类/包裹类 )
swift针对这个问题,专门设计了一个叫”optional value(可选变量)”  的变量,它就是为了解决这个问题的。
语法:
 var n : UInt ? = 5    或则  var n ? = 5

这里的?表示n 是个可选变量, 也就是说 n 有可能不存在, 什么情况下n不存在呢?
如果你这样写:
var n : UInt ?
此外,需要注意的是swift语法中,nil 并不是0 , 而是一个NilType类型的变量

所以上面提到的那个问题就可以很容易解决了
func FindScoreByName( source:DataSource, name:String )->UInt?  //返回的是可选变量
{
    var score : UInt ?; //此时 score 的变量没有分配内存,也就是说score为nil
    if( source.HasStudent( name: name ) )
        score = source[ name ]. score;  //这里score才分配内存;

    return score; //如果没有找到学生信息, score的内存一直没被分配
}



[ 此帖被xu54在2014-06-06 14:32重新编辑 ]

清空我的评分动态本帖最近评分记录: 共1条评分记录
gagaga 可可豆 +5 2014-06-04 -
隐藏评分记录
级别: 新手上路
UID: 304453
精华: 0
发帖: 1
可可豆: 1 CB
威望: 1 点
在线时间: 37(时)
注册时间: 2014-03-31
最后登录: 2014-09-29
1 楼:  发表于: 2014-06-04 12:19    发自: Web Page
“”“
关注的应该是业务逻辑,而不应该把精力分散在语法等低级问题上,语法消耗我们的时间越少,这门语言就越成功
”“”
这句话我觉得说得很不错,大部分应用场景下程序猿们更多的关注业务逻辑的实现,相比之下swift做得明显更好
级别: 新手上路
UID: 320848
精华: 0
发帖: 10
可可豆: 29 CB
威望: 19 点
在线时间: 10(时)
注册时间: 2014-06-03
最后登录: 2014-06-11
2 楼:  发表于: 2014-06-04 12:19    发自: Web Page
能否取代OC拭目以待吧,反正偶们先上了
级别: 版主

状态: 连续签到 - [4天]
UID: 301302
精华: 0
发帖: 1723
可可豆: 1535 CB
威望: 2482 点
在线时间: 2797(时)
注册时间: 2014-03-19
最后登录: 2017-07-05
3 楼:  发表于: 2014-06-04 12:58    发自: Web Page
GOOD JOB
级别: *
UID: 240768
精华: *
发帖: *
可可豆: * CB
威望: * 点
在线时间: (时)
注册时间: *
最后登录: *
4 楼:  发表于: 2014-06-04 12:58    发自: Web Page
挺不错的,速度更新吧
级别: 新手上路

状态: 连续签到 - [1天]
UID: 234971
精华: 0
发帖: 15
可可豆: 62 CB
威望: 26 点
在线时间: 262(时)
注册时间: 2013-07-30
最后登录: 2017-04-21
5 楼:  发表于: 2014-06-04 14:50    发自: Web Page
先mark一下


    
级别: 新手上路
UID: 84110
精华: 0
发帖: 20
可可豆: 121 CB
威望: 101 点
在线时间: 94(时)
注册时间: 2011-07-29
最后登录: 2018-06-05
6 楼:  发表于: 2014-06-04 15:08    发自: Web Page

级别: 新手上路
UID: 147247
精华: 0
发帖: 8
可可豆: 71 CB
威望: 71 点
在线时间: 0(时)
注册时间: 2012-06-05
最后登录: 2016-03-27
7 楼:  发表于: 2014-06-04 15:22    发自: Web Page
我是来学习的。刚刚学习oc半年,控件了解一些。现在新开始学习Swift。算是给大家机会吧
级别: *
UID: 243044
精华: *
发帖: *
可可豆: * CB
威望: * 点
在线时间: (时)
注册时间: *
最后登录: *
8 楼:  发表于: 2014-06-04 15:42    发自: Web Page
学习了,非常感谢!
级别: *
UID: 241931
精华: *
发帖: *
可可豆: * CB
威望: * 点
在线时间: (时)
注册时间: *
最后登录: *
9 楼:  发表于: 2014-06-04 15:50    发自: Web Page
nice 赞一个
描述
快速回复

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

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

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