原創(chuàng)|對(duì)比評(píng)測(cè)|編輯:龔雪|2014-06-05 09:35:34.000|閱讀 1022 次
概述:本文主要討論蘋果新編程語言Swift 和 Objective-C,兩者相互對(duì)比,揭示Swift在Objective-C基礎(chǔ)上是如何進(jìn)化的,分析Swift比Objective-C好的原因。并且對(duì)#Swift會(huì)取代Objective-C#的論點(diǎn)進(jìn)行了討論說明。
# 界面/圖表報(bào)表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關(guān)鏈接:
寫完Swift 與 Objective-C對(duì)比評(píng)測(cè)之后,有很多朋友不同意我關(guān)于 #Swift會(huì)取代Objective-C#的論點(diǎn),在這里我想強(qiáng)調(diào)兩點(diǎn):
1、Swift其實(shí)就是Objective-C的文本變種,對(duì)于這門全新的語言,蘋果做的工作其實(shí)遠(yuǎn)沒有我們想像的艱巨。LLVM編譯器做工作只是先把swift翻譯成objctive-c代碼,然后再把objective-c代碼翻譯成c語言代碼,然后再把c語言代碼翻譯成匯編,最終翻譯成機(jī)器碼。至于為什么編譯器廠商這么繞,不直接把自己的語言翻譯成匯編和機(jī)器碼,那是由于現(xiàn)有的語言編譯器(Objective-C, C )已經(jīng)非常成熟,而高級(jí)語言間的文本轉(zhuǎn)換開發(fā)成本和維護(hù)成本都極其小。Swift為什么要翻譯成Objective-C,是由于Swift仍然需要Objective-C中辛苦構(gòu)建的ARC,GCD 等環(huán)境。
2、既然Swift代碼最終會(huì)被LLVM翻譯成Objective-C, 那swift語言還有什么意義?想想ARC剛出來的時(shí)候大家的反應(yīng)吧,很多人和今天的反應(yīng)一樣,認(rèn)為我是資深的objective-c馬仔了,我深諳內(nèi)存管理之道,不停的寫[ obj release ], [ obj autoRelease] 很牛,只有那些初學(xué)者才會(huì)用ARC呢。結(jié)果就是不到一年,ARC統(tǒng)治了整個(gè)馬仔界,因?yàn)槲覀凂R仔關(guān)注的應(yīng)該是業(yè)務(wù)邏輯,而不應(yīng)該把精力分散在語法等低級(jí)問題上,語法消耗我們的時(shí)間越少,這門語言就越成功。
既然Swift其實(shí)就是Objective-C, 對(duì)入門者而言遠(yuǎn)比Objective-C好學(xué),對(duì)資深開發(fā)者來說又能節(jié)約很多無謂的低級(jí)重復(fù)的機(jī)械代碼(這些代碼在LLVM翻譯成objective-c時(shí),編譯器自動(dòng)幫你寫上)。我是想不出任何一點(diǎn)swift不替換Objective-C的理由呢。
好吧,爭(zhēng)論放置一邊不表,我們從頭來看Swift到底進(jìn)化到什么程度。
--------------------大法之初,無為乃大---------------------
var n = 22
對(duì)于編譯器而言,既然你都初始化為22了,它當(dāng)然明白n是int , 你都打回車了, 它當(dāng)然知道這是語句的結(jié)束,所以LLVM毫無壓力的把它翻譯成
int n = 22;
當(dāng)然對(duì)于多個(gè)語句放一行,那編譯器就沒有辦法了, 你還是要用分號(hào)來結(jié)束語句。如果沒有初始化,你也可以手工指定變量類型
var n = 22; var hero:Hero
所以看上去是無類型變量,實(shí)質(zhì)上還是強(qiáng)類型的( 編譯器給你做了 )
如果是常量的話, 用let
let PI = 3.1415926
這里的PI 就是常量, 現(xiàn)在想想,以前的強(qiáng)類型高級(jí)語言真是傻到無語啊,let PI = 3.1415926 , PI 都這么明顯是個(gè)double, 為啥還要程序員再寫double ?! 玩我呢??!
func test( p1: int, p2: int )
{
}
調(diào)用: test( p1:25 , p2:100 )
如果有返回值, 返回類型用符號(hào) “ -> ” 表示
func add( p1: int, p2 : int )->int
{
return p1+p2
}
這可比Objective-C又是標(biāo)簽又是變量名方便多了! 并且仍然保留標(biāo)簽特性,可讀性比其他語言強(qiáng)
不再分頭文件和m文件了!這點(diǎn)和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 )”;
}
}
注意終于有構(gòu)造函數(shù)了!!init 是系統(tǒng)自動(dòng)調(diào)用的, 不需要程序員手工調(diào)用。所以它寫起來和普通函數(shù)也有區(qū)別,前邊不能加func。 編譯器為什么要這樣做?因?yàn)槿绻鹖nit也允許前面加上func, 萬一程序員不小心把init函數(shù)名寫錯(cuò)了, 寫成func Inot( ),編譯器就完全不知道它是程序員想寫的構(gòu)造函數(shù)。現(xiàn)在構(gòu)造函數(shù)前不加func , 如果你寫成Inot( ) 。 編譯器一看前面沒有func知道你要寫構(gòu)造,可函數(shù)名又不是init, 編譯器就知道你不小心寫錯(cuò)了就可以立刻報(bào)錯(cuò)啦!!
比如客戶需要提供一個(gè)最終的API, 客戶給你一個(gè)數(shù)據(jù)源, 需要在數(shù)據(jù)源里找到名字是“jack.xu”的學(xué)員成績(jī)。這個(gè)api的設(shè)計(jì)應(yīng)該是這樣的:
float FindScoreByName( DataSource* source, string* name );
問題來了,如果“jack.xu”的學(xué)員根本不存在,應(yīng)該返回啥? 返回0?那肯定不對(duì),因?yàn)?有可能也是學(xué)員的成績(jī)。當(dāng)然,如果返回的是類的對(duì)象,直接返回 NULL , 調(diào)用者就知道沒有找到,現(xiàn)在是基本數(shù)據(jù)類型,返回NULL 其實(shí)就是0,怎么辦?(在c,c++中的規(guī)范做法是 返回bool表示是否找到,而成績(jī)通過形參來傳遞 ,其他高級(jí)語言中可以封裝一個(gè)小類 )
但無論怎么處理,都讓人感覺憋屈,這么個(gè)簡(jiǎn)單的問題,語法都有缺陷!現(xiàn)在好了!swift針對(duì)這個(gè)問題,專門設(shè)計(jì)了一個(gè)叫”optional value(可選變量)” 的變量,它就是為了解決這個(gè)問題的。
語法:
var n : int ? = 5 或則 var n ? = 5
這里的?表示n 是個(gè)可選變量, 也就是說 n 有可能不存在, 什么情況下n不存在呢?
如果你這樣寫:
var n : int ?
只要后面不對(duì)n 賦值 , n 就不存在, 這句話和不加問好的區(qū)別就是:
var n : int //無論是否賦值,此刻n的內(nèi)存都分配了 var n : int ? //此刻 n 根本沒有分配內(nèi)存, 對(duì)n 取地址 : &n 為NULL , 但是如果后面有賦值語句 n = 100 , 這時(shí)候開始n 才會(huì)開始分配內(nèi)存
注意,如果要判斷n 是否存在, 不可以用
if( n == nil ) , 因?yàn)閚il 其實(shí)就是0, 這一句只是用來判斷n 的數(shù)值是否為0 , 而不是判斷n 的變量是否存在( 內(nèi)存是否分配 ),要判斷n 是否存在, 需要這樣
if( let k = n )
在這里, n如果未分配內(nèi)存, let k = n 表達(dá)式的結(jié)果為false
所以上面提到的那個(gè)問題就可以很容易解決了
func FindScoreByName( source:DataSource, name:String )->int? //返回的是可選變量
{
var score : int ?; //此時(shí) score 的變量沒有分配內(nèi)存,也就是說score不存在
if( source.HasStudent( name: name ) )
score = source[ name ]. score; //這里score才分配內(nèi)存;
return score; //如果沒有找到學(xué)生信息, score的內(nèi)存一直沒被分配
}
轉(zhuǎn)載自:cocoachina
原文鏈接://www.cocoachina.com/bbs/read.php?tid=204525
相關(guān)閱讀:
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請(qǐng)務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請(qǐng)郵件反饋至chenjj@ke049m.cn
文章轉(zhuǎn)載自:慧都控件網(wǎng)