亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

Swift與Objective-C的對比

2019-11-14 19:58:15
字體:
來源:轉載
供稿:網友

WWDC 2014上蘋果再次驚世駭俗的推出了新的編程語言Swift 雨燕, 這個消息會前沒有半點風聲的走漏。消息發布當時,會場一片驚呼,相信全球看直播的碼農們當時也感覺腦袋被敲了一記悶棍吧。于是熬夜學習了Swift大法, 越看越想高呼 ” Swift大法好!“

 

程序員,最講究的就是實事求是和客觀,下面就開始對比兩種語言。

 

首先要強調的是,Swift絕對不是解釋性語言,更不是腳本語言,它和Objective-C,C++一樣,編譯器最終會把它翻譯成C語言,也就是 說編譯器最終面對的其實都是C語言代碼( 這是千真萬確,不容置疑的?。?!所以不要看它長的想腳本語言,其實它是比java, C#要高效的多的C語言?。。。荢wift的強大之處在于它站在所有語言的肩膀上,吸取所有語言的精華。

 

這個系列我們先談談幾個最基本的語法變化:

  1. 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很完美的解決了這個問題 :

C代碼 復制代碼 收藏代碼
  1. [ rect setX:10 y:20 width:100 height:500 ]  
[ rect setX:10 y:20 width:100 height:500 ]

 

 

看看!多棒!Swift當然不會丟棄這么好的傳統, 在Swift中是這個樣子的

C代碼 復制代碼 收藏代碼
  1. rect.set( 10, y:20, width:100, height:500 )  
rect.set( 10, y:20, width:100, height:500 )

 

 

對于調用方法時,標簽的使用需要注意以下兩點:

 

1)全局函數的調用,不可以使用標簽

  1. fun( 11, 22 , 33 ) //正確
  2. fun( n1:11, n2: 22, n3: 33 ) //錯誤

2 ) 類的函數,第一個參數不可以加標簽

  1. rect.set( 100, y:100, width:300, height: 200 ) //正確
  2. rect.set( x:100, y:100, width:300, height: 200 ) //錯誤

 

其實Swift中對類的定義和java, c#幾乎一樣,再也不分頭文件和.m文件了。

一個類的定義語法如下:

C代碼 復制代碼 收藏代碼
  1. class Weapon  
  2. {  
  3.     var name:NSString  
  4.     var power:int  
  5.     init( name:NSString, power:int )  
  6.     {  
  7.         self.name = name  
  8.         self.power = power  
  9.     }  
  10.     func shoot( )  
  11. }  
class Weapon{    var name:NSString    var power:int    init( name:NSString, power:int )    {        self.name = name        self.power = power    }    func shoot( )}

 

注意:Swift中的語句不需要分號結束.

其次,終于有構造函數和析構函數了!??!Objective-C也有?no no no!!!

Objective-C中沒有構造函數,真正的構造函數是系統自動調用的,而不是強迫程序員去調用。以前要強迫程序員[ [ Obj alloc ] init ],現在終于終于終于系統自動調用了!

C代碼 復制代碼 收藏代碼
  1. Weapon weapon = Weapon( name:“人間大炮”, power: 100000000000 )  
Weapon weapon = Weapon( name:“人間大炮”, power: 100000000000 )

 

我沒有寫錯, 對的!現在和java,C#一樣!雖然weapon是一個指針,但不要寫那顆星號!!因為這顆星號嚇死過好多人!“ 啥?指針??。“?。。。。。”

 

C、 C++的程序員注意了,這個weapon對象不是分配在棧內存上的, 仍然是alloc出來的, 在堆上呢。

  1. 最期待的語法終于加入了!

對于override在Java,C++,Objective-C中都有問題,舉個栗子:

C代碼 復制代碼 收藏代碼
  1. @interface Weapon  
  2. -(void)shoot;  
  3. @end  
  4. @interface Gun : Weapon  
  5. -(void)Shoot;  
  6. @end  
@interface Weapon-(void)shoot;@end@interface Gun : Weapon-(void)Shoot;@end

 

在大項目中經常會遇到這個問題,程序員的本意是希望覆蓋父類的shoot ,結果手潮。。。。寫成了Shoot , 這既沒有語法錯誤,也沒有邏輯錯誤,結果在

C代碼 復制代碼 收藏代碼
  1. Weapon*  currentWeapon = [ Gun new ];  
Weapon*  currentWeapon = [ Gun new ];

 

[currentWeapon shoot ] 中調用的卻是父類的shoot方法( 因為子類根本沒有覆蓋啦,子類大小寫不小心寫錯了 ), 這種小錯誤如果出現在超大型項目種還真是很難找呢?。‖F在,Swift終于解決這個問題啦! 子類覆蓋父類方法的時候,一定要在方法前寫上override :

C代碼 復制代碼 收藏代碼
  1. override func shoot{  
  2. }  
override func shoot{}

 

這樣,編譯器一看方法前寫了override, 它就會在父類中去查找是否有shoot方法, 如果你寫錯成override func Shoot, 那編譯器就立刻能發現報錯啦!

 

系列(二)

 

系列一發表后,有人不同意我的關于 #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)語句不需要分號結束,變量如果有初始化就不需要類型

C代碼 復制代碼 收藏代碼
  1. var n = 22  
var n = 22

 

對于編譯器而言,既然你都初始化為22了,它當然明白n是int , 你都打回車了, 它當然知道這是語句的結束,所以LLVM毫無壓力的把它翻譯成

C代碼 復制代碼 收藏代碼
  1. int n = 22;  
int n = 22;

 

當然對于多個語句放一行,那編譯器就沒有辦法了, 你還是要用分號來結束語句。如果沒有初始化,你也可以手工指定變量類型

C代碼 復制代碼 收藏代碼
  1. var n = 22; var hero:Hero  
var n = 22; var hero:Hero

 

所以看上去是無類型變量,實質上還是強類型的( 編譯器給你做了 ).

如果是常量的話, 用let

C代碼 復制代碼 收藏代碼
  1. let PI = 3.1415926  
let PI = 3.1415926

 

這里的PI 就是常量, 現在想想,以前的強類型高級語言真是傻到無語啊,let PI = 3.1415926 , PI  都這么明顯是個double, 為啥還要程序員再寫double ?!

 

2)函數的定義

C代碼 復制代碼 收藏代碼
  1. func test( p1: int, p2: int )  
  2. {  
  3. }  
func test( p1: int, p2: int ){}

 

調用: test( 25 , 100 ) //注意:全局函數的調用,參數不能加標簽

如果有返回值, 返回類型用符號 “ -> ” 表示

C代碼 復制代碼 收藏代碼
  1. func  add( p1: int, p2 : int )->int  
  2. {  
  3.     return p1+p2  
  4. }  
func  add( p1: int, p2 : int )->int{    return p1+p2}

 

3)類的定義

不再分頭文件和m文件了!這點和java, C#一模一樣

C代碼 復制代碼 收藏代碼
  1. class Person  
  2. {  
  3.     var    name:String  
  4.     var    age = 0  
  5.     init( name:String , age:int )  
  6.     {  
  7.         self.name = name;  
  8.         self.age = age;  
  9.     }  
  10.     func description( )->String  
  11.     {  
  12.         return “Name:/( self.name ) ; Age: /( age )”;  
  13.     }  
  14. }  
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 )”;    }}

 

注意終于有構造函數了?。nit 是系統自動調用的, 不需要程序員手工調用。所以它寫起來和普通函數也有區別,前邊不能加func。 編譯器為什么要這樣做?因為如果init也允許前面加上func, 萬一程序員不小心把init函數名寫錯了, 寫成func Inot( ),編譯器就完全不知道它是程序員想寫的構造函數?,F在構造函數前不加func , 如果你寫成Inot( ) 。 編譯器一看前面沒有func知道你要寫構造,可函數名又不是init, 編譯器就知道你不小心寫錯了就可以立刻報錯啦!!

 

4)可選變量# ---所有高級語言一開始就遇到的難題

比如客戶需要提供一個最終的API, 客戶給你一個數據源, 需要在數據源里找到名字是“jack.xu”的學員成績。這個api的設計應該是這樣的:

C代碼 復制代碼 收藏代碼
  1. int FindScoreByName( DataSource*  source, string* name );  
int FindScoreByName( DataSource*  source, string* name );

 

問題來了,如果“jack.xu”的學員根本不存在,應該返回啥? 返回0?那肯定不對,因為0有可能也是學員的成績。當然,如果返回的是類的對象,直接返回 NULL , 調用者就知道沒有找到,現在是基本數據類型,返回NULL 其實就是0,怎么辦?(在C,C++中的規范做法是 返回bool表示是否找到,而成績通過形參來傳遞 ,其他高級語言中可以封裝一個小類/包裹類 )

 

Swift針對這個問題,專門設計了一個叫”optional value(可選變量)”  的變量,它就是為了解決這個問題的。

語法:

C代碼 復制代碼 收藏代碼
  1. var n : UInt ? = 5    或者  var n ? = 5  
var n : UInt ? = 5    或者  var n ? = 5

 

這里的?表示n 是個可選變量, 也就是說 n 有可能不存在, 什么情況下n不存在呢?

如果你這樣寫:

C代碼 復制代碼 收藏代碼
  1. var n : UInt ?  
var n : UInt ?

 

此外,需要注意的是swift語法中,nil 并不是0 , 而是一個NilType類型的變量

所以上面提到的那個問題就可以很容易解決了

C代碼 復制代碼 收藏代碼
  1. func FindScoreByName( source:DataSource, name:String )->UInt?  //返回的是可選變量  
  2. {  
  3.     var score : UInt ?; //此時 score 的變量沒有分配內存,也就是說score為nil  
  4.     if( source.HasStudent( name: name ) )  
  5.         score = source[ name ]. score;  //這里score才分配內存;  
  6.     return score; //如果沒有找到學生信息, score的內存一直沒被分配  
  7. }  
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的內存一直沒被分配}

 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩av免费在线看| 日韩精品在线免费观看| 久久亚洲精品国产亚洲老地址| 亚洲精品一区二区三区婷婷月| 日本亚洲欧洲色| 午夜精品福利电影| 日韩高清电影免费观看完整版| 精品一区二区三区电影| 国产一区二区三区视频在线观看| 欧美大片在线看免费观看| 亚洲欧洲美洲在线综合| 性欧美xxxx交| 欧美精品免费看| 精品久久久视频| 久久精品视频一| 午夜免费在线观看精品视频| 久久久国产精品视频| 日韩不卡中文字幕| 亚洲欧美日韩中文在线制服| 国产精品无av码在线观看| 久久久亚洲精选| 色悠悠久久88| 国内精品久久久久久| 亚洲精品成a人在线观看| 国产精品美女免费| 亚洲女人天堂色在线7777| 国色天香2019中文字幕在线观看| 欧美激情视频一区二区| 亚洲国产婷婷香蕉久久久久久| 亚洲精品按摩视频| 国产大片精品免费永久看nba| 中文字幕精品网| 国产精品最新在线观看| 国产精品嫩草影院久久久| 国产成人一区二| 国产成人短视频| 亚洲少妇中文在线| 色噜噜久久综合伊人一本| 国产精品va在线播放我和闺蜜| 国产欧美一区二区三区视频| 久久久午夜视频| 国产精品麻豆va在线播放| 国内偷自视频区视频综合| 国内精品美女av在线播放| 亚洲男人第一av网站| 性亚洲最疯狂xxxx高清| 欧美老妇交乱视频| 日韩高清免费观看| 最近更新的2019中文字幕| 一区二区三区 在线观看视| 国产欧美日韩高清| 国产亚洲精品日韩| 亚洲人成人99网站| 亚洲国产精品久久久久| 欧美日韩免费在线| 欧美国产视频日韩| 日本三级韩国三级久久| 日韩在线视频免费观看| 国产免费一区二区三区在线能观看| 亚洲无限乱码一二三四麻| 国产国语videosex另类| 久久精品国产一区二区三区| 国产精品私拍pans大尺度在线| 欧美专区在线视频| 精品magnet| 亚洲成人免费网站| 欧美亚州一区二区三区| 国产精品国产福利国产秒拍| 91av在线影院| 久久久精品久久久久| 国产99久久精品一区二区| 日韩免费在线视频| 97精品伊人久久久大香线蕉| 欧美日韩中文字幕综合视频| 欧美巨猛xxxx猛交黑人97人| 隔壁老王国产在线精品| 国产成人精品a视频一区www| 亚洲欧美日本另类| 久久久久亚洲精品成人网小说| 中文字幕在线看视频国产欧美在线看完整| 神马国产精品影院av| 国产原创欧美精品| 亚洲 日韩 国产第一| 国产成人久久久精品一区| 精品久久久久久久久久ntr影视| 欧美日韩国产专区| 91在线直播亚洲| 91精品国产99久久久久久| 色综合久综合久久综合久鬼88| 欧美中在线观看| 中文字幕日韩在线观看| 欧美精品videossex性护士| 欧美激情在线有限公司| 国产日韩欧美综合| 最好看的2019年中文视频| 91欧美精品午夜性色福利在线| 国产99久久精品一区二区 夜夜躁日日躁| 国产主播在线一区| 两个人的视频www国产精品| 国产精品久久久久久久久久小说| 伊人伊成久久人综合网小说| 欧美国产高跟鞋裸体秀xxxhd| 亚洲专区国产精品| 国产一区二区三区18| 91地址最新发布| 亚洲男人天堂2019| 欧美国产日韩视频| 精品日本美女福利在线观看| 精品国内产的精品视频在线观看| 青青草精品毛片| 亚洲区中文字幕| 91chinesevideo永久地址| 97视频免费在线观看| 久久精品成人欧美大片古装| 亚洲精品720p| 在线观看91久久久久久| 欧美成人午夜影院| 亚洲午夜国产成人av电影男同| 欧美xxxx做受欧美.88| 国产精品久久久亚洲| 亚洲高清一二三区| 欧美精品激情在线观看| 中文字幕不卡av| 高清欧美性猛交xxxx黑人猛交| 日韩av网址在线观看| 亚洲精品一区二区三区婷婷月| 国产一区二区三区视频免费| 97在线免费视频| 亚洲国产成人精品女人久久久| 一本一本久久a久久精品综合小说| 一本色道久久88综合日韩精品| 成人网欧美在线视频| 韩国福利视频一区| 久久久久久中文字幕| 亚洲人成五月天| 国产97在线|亚洲| 国产精品国产自产拍高清av水多| 午夜精品久久久久久久男人的天堂| 精品欧美国产一区二区三区| 久久综合国产精品台湾中文娱乐网| 国产精品情侣自拍| 亚洲国产精品久久91精品| www.国产精品一二区| 国产精品都在这里| 久久中文久久字幕| 欧美激情视频在线免费观看 欧美视频免费一| 97成人精品区在线播放| 国产精品欧美激情在线播放| 国产精品午夜一区二区欲梦| 一本一道久久a久久精品逆3p| 成人黄色av网| 久久久久国产精品一区| 精品久久久久久久久久久久久久| 欧美日韩亚洲精品一区二区三区| 欧美壮男野外gaytube| 欧美日韩国产一中文字不卡| 欧美视频在线免费看| 欧美性xxxxxxxxx| 欧美大胆a视频| 国产一区二区三区在线视频| 亚洲自拍偷拍一区| 久久精品影视伊人网| 欧美精品www在线观看| 亚洲人精选亚洲人成在线|