提供3000多款全球软件/控件产品
针对软件研发的各个阶段提供专业培训与技术咨询
根据客户需求提供定制化的软件开发服务
全球知名设计软件,显著提升设计质量
打造以经营为中心,实现生产过程透明化管理
帮助企业合理产能分配,提高资源利用率
快速打造数字化生产线,实现全流程追溯
生产过程精准追溯,满足企业合规要求
以六西格玛为理论基础,实现产品质量全数字化管理
通过大屏电子看板,实现车间透明化管理
对设备进行全生命周期管理,提高设备综合利用率
实现设备数据的实时采集与监控
利用数字化技术提升油气勘探的效率和成功率
钻井计划优化、实时监控和风险评估
提供业务洞察与决策支持实现数据驱动决策
原创|对比评测|编辑:龚雪|2014-06-05 09:35:34.000|阅读 934 次
概述:本文主要讨论苹果新编程语言Swift 和 Objective-C,两者相互对比,揭示Swift在Objective-C基础上是如何进化的,分析Swift比Objective-C好的原因。并且对#Swift会取代Objective-C#的论点进行了讨论说明。
# 慧都年终大促·界面/图表报表/文档/IDE等千款热门软控件火热促销中 >>
相关链接:
写完Swift 与 Objective-C对比评测之后,有很多朋友不同意我关于 #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到底进化到什么程度。
--------------------大法之初,无为乃大---------------------
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 ?! 玩我呢??!
func test( p1: int, p2: int ) { }
调用: test( p1:25 , p2:100 )
如果有返回值, 返回类型用符号 “ -> ” 表示
func add( p1: int, p2 : int )->int { return p1+p2 }
这可比Objective-C又是标签又是变量名方便多了! 并且仍然保留标签特性,可读性比其他语言强
不再分头文件和m文件了!这点和java, c#一模一样
class Person { var name:String var age = 0 init( name:String , age:int ) { 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, 编译器就知道你不小心写错了就可以立刻报错啦!!
比如客户需要提供一个最终的API, 客户给你一个数据源, 需要在数据源里找到名字是“jack.xu”的学员成绩。这个api的设计应该是这样的:
float FindScoreByName( DataSource* source, string* name );
问题来了,如果“jack.xu”的学员根本不存在,应该返回啥? 返回0?那肯定不对,因为0有可能也是学员的成绩。当然,如果返回的是类的对象,直接返回 NULL , 调用者就知道没有找到,现在是基本数据类型,返回NULL 其实就是0,怎么办?(在c,c++中的规范做法是 返回bool表示是否找到,而成绩通过形参来传递 ,其他高级语言中可以封装一个小类 )
但无论怎么处理,都让人感觉憋屈,这么个简单的问题,语法都有缺陷!现在好了!swift针对这个问题,专门设计了一个叫”optional value(可选变量)” 的变量,它就是为了解决这个问题的。
语法:
var n : int ? = 5 或则 var n ? = 5
这里的?表示n 是个可选变量, 也就是说 n 有可能不存在, 什么情况下n不存在呢?
如果你这样写:
var n : int ?
只要后面不对n 赋值 , n 就不存在, 这句话和不加问好的区别就是:
var n : int //无论是否赋值,此刻n的内存都分配了 var n : int ? //此刻 n 根本没有分配内存, 对n 取地址 : &n 为NULL , 但是如果后面有赋值语句 n = 100 , 这时候开始n 才会开始分配内存
注意,如果要判断n 是否存在, 不可以用
if( n == nil ) , 因为nil 其实就是0, 这一句只是用来判断n 的数值是否为0 , 而不是判断n 的变量是否存在( 内存是否分配 ),要判断n 是否存在, 需要这样
if( let k = n )
在这里, n如果未分配内存, let k = n 表达式的结果为false
所以上面提到的那个问题就可以很容易解决了
func FindScoreByName( source:DataSource, name:String )->int? //返回的是可选变量 { var score : int ?; //此时 score 的变量没有分配内存,也就是说score不存在 if( source.HasStudent( name: name ) ) score = source[ name ]. score; //这里score才分配内存; return score; //如果没有找到学生信息, score的内存一直没被分配 }
转载自:cocoachina
原文链接://www.cocoachina.com/bbs/read.php?tid=204525
相关阅读:
本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@pclwef.cn
文章转载自:慧都控件网当您需要在 SWT 应用程序中显示 Web 内容时,通常有两种选择:内置浏览器小部件或像 JxBrowser 这样的商业选项?本文分析了两者之间的差异,并帮助您根据自己的需求选择合适的解决方案。
本文将介绍标准WPF DataGrid与DevExpress WPF GridControl之间的主要区别,希望能帮助大家选择正确的工具!
本文将介绍标准WPF DataGrid与DevExpress WPF GridControl之间的主要区别,希望能帮助大家选择正确的工具!
本文将详细评测Navicat的主要功能、用户体验以及其在数据库管理中的应用,希望能帮助到大家~
服务电话
重庆/ 023-68661681
华东/ 13452821722
华南/ 18100878085
华北/ 17347785263
客户支持
技术支持咨询服务
服务热线:400-700-1020
邮箱:sales@pclwef.cn
关注我们
地址 : 重庆市九龙坡区火炬大道69号6幢