標籤:
http://www.cocoachina.com/bbs/read.php?tid=204294
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;)全域函數的調用,不可以使用標籤
?
12 |
fun( 11, 22 , 33 ) //正確? fun( n1:11, n2: 22, n3: 33 ) //錯誤? |
2: ) 類的函數,第一個參數不可以加標籤 。
?
12 |
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重新編輯 ]
swift對比object-c