【小(xiǎo)編推薦】詳解Swift 2.0(一(yī)):蘋果做σ♣↕ (zuò)的(de)25項改變

2015-07-24   ←¥;|   發布者:梁國(guó)芳&nb∞↕☆£sp;  |    €≥Ω;查看(kàn):3320次

IT新聞
 CSDN移動将持續為(wèi)您優選移動開(k∞σ āi)發的(de)精華內(nèi)容,共同探討(tǎoλ≥)移動開(kāi)發的(de)技(jì)術(shù)±≥熱(rè)點話(huà)題,涵蓋移動應用(yòng)、開(kāi)發工∑≠φ(gōng)具、移動遊戲及引擎、智能(néng)硬件(jiàn)、物(w₽↔↔λù)聯網等方方面面。如(rú)果您想投稿、參與內(n←>₽èi)容翻譯工(gōng)作(zuò),或尋求✘'近(jìn)匠(jiàng)報(bào)道(•σdào),請(qǐng)發送郵件(jiàn)至tangx♣↔'y#csdn.net(請(qǐng)把#β♠™改成@)。 

毫無疑問(wèn),Swift 2.0在2015全球開(kāi)"<© 發者大(dà)會(huì)(Worldwidπδ≠e Developers Conference, WWDC 2>£¥‍015)上(shàng)被發布的(de)消息衆人(r₽β₹én)皆知(zhī)。我會(huì)就(jiù)該語言所發生(shē×✔ng)的(de)變化(huà)撰寫一(y↓€'ī)系列的(de)文(wén)章(zhāng),但(dà←₩↑n)目前我們先說(shuō)說(shuō)重λ✔點。

常規變化(huà)

 

 

內(nèi)部的(de)可(kě)見(jiàn)性

這(zhè)解決了(le)單元測試中的(de)一(yī)個(gè)較大(dà)✘→的(de)難點。以前的(de)做(zuò)法:

 

 

現(xiàn)在可(kě)以啓用(yòn‍€✘g)testability,它就(jiù)像C#中的(de)Interna¥♥¥‌lsVisibleTo。主應用(yòng)程序目标模塊的(de)內(nèi)部α‌細節對(duì)測試模塊可(kě)見(jiàn)。γ≠‍

 

 

這(zhè)将導緻測試忽略某些(xiē)優化(huà)行(xíng)為(wè ♦≤i)并保留稍後導入到(dào)測試模塊中的(de)那(nà)↔€σ‍些(xiē)內(nèi)部符号。官方文(wén)檔Ωφ€警告說(shuō),由于阻止了(le)某些(xiē)優化(huà),因此這(z÷ $hè)隻适用(yòng)于調試和(hé)測試版$λσ本。

模式匹配

switch語句的(de)模式匹配(pattern match≈ε©×ing)語法和(hé)“if le"‍t ..., .... where&rdq≤←uo;語法一(yī)直在推廣。可(kě)以在任何控π ™制(zhì)流中使用(yòng)逗号操作(zuò>₽&®)符和(hé)where條件(jiàn)δφ語句。還(hái)可(kě)以使用(yòng)新的(de)case條件(jiααàn)語句,例如(rú):if case .Silly(let a£$) { }。還(hái)有(yǒu)一(yī)種用(yòng☆α)于Optional<T>的(de)特殊形式:i↕₩f case let a? = anOptionα✘✘≈al { }。

模式匹配在循環語句中也(yě)可(kě)以使用(yòng):for ∞≥≥case let thing? in array { }。© ₩

這(zhè)又(yòu)是(shì)值得(de)單獨成文('¥wén)的(de)另一(yī)個(gè)特性。

Objective-C的(de)泛型和(hé)__kindof的(de)★¥‌用(yòng)法

在關于Swift的(de)文(wén)章(zh εγāng)裡(lǐ)談論這(zhè)個(gè)做(zuò)甚?它的$≤✔♠(de)作(zuò)用(yòng)是(shì)使某些(x♦©™iē)銜接更加清晰和(hé)簡便。不(bù)求在這(zhè)篇σφ©α文(wén)章(zhāng)中面面俱到(dào),我™→會(huì)再單起一(yī)篇文(wénΩ ♥∞)章(zhāng)闡述它。

錯(cuò)誤處理(lǐ)

這(zhè)不(bù)是(shì)我們一(yī)貫所認識的(€δde)異常,這(zhè)是(shì)一(yī)個(gè)使函數(shù)λλβ≤提前返回Result<T, Error>的(de×£±β)操作(zuò),單隐藏了(le)所有(yǒu)提前返回的(de)對(duì)≤×象,也(yě)隐藏了(le)錯(cuò)誤解析(error unwrappi• ↑ng)過程等內(nèi)容。

 

[cpp] view plaincopy
 
  1. let systemAttribute≠♦s: [NSObject: AnyObject]?<♣"$  
  2. do {  
  3.     syst↕​emAttributes =&nb★>sp;try NSFileManager.™®↕‌defaultManager().attributesOfFil₽↑eSystemForPath(documen₽✔×tDirectoryPath.last!)  
  4. catch _ {  
  5.     sys≤₹βtemAttributes =&nbs✘★$'p;nil  
  6. }  

 

它完美(měi)地(dì)與Objective-C進行"↔↕(xíng)互操作(zuò),Swift語言中,将标×♥∞記為(wèi)throws的(de)方法作(z☆δπuò)為(wèi)選擇器(qì)。這(zhè)是(shì)使用(yòng®φ)NSError的(de)方法,-(BOOL or nul"≈≥lable type)someMethodTakingPβ₽α&aram:(type)param error:(NSε<<Error **),這(zhè)種樣式會(huì)自(z ×γì)動引入标記為(wèi)throws的(de)方法。

應該明(míng)白(bái)的(de)是(shì)這(zhè)并不(bù)♣ £像Java中已經被檢查過的(de)異常(checke'©d exception)那(nà)樣。Sw§✘™€ift語言并不(bù)關心異常的(de)類型,或者處理(lǐ)或者不(bù)處​π←理(lǐ)。這(zhè)又(yòu)是(shì)♣ ≤∑值得(de)單獨成文(wén)的(de)另一(yī)功能(néng)特性。₹₽♥↓

Defer關鍵字

關鍵字defer也(yě)很(hěn)重要(yào),因為(w±≥$èi)它可(kě)以取代傳統C風(fēn≈¥←g)格的(de)“if(err) goto cleanup&rd≈✘★quo;。獲得(de)資源後接著(zhe)就(jiù)是(shì)✔♥↓defer { release_resour ↓δce() }。然後不(bù)管函數(shù)返回結果如(rú)何,獲₽≠↕↔得(de)的(de)資源都(dōu)将被清理>‌(lǐ)。這(zhè)也(yě)意味著(zhe)資源的(de)釋放(₽   fàng)緊随獲取資源之後。這(zhè)看(§>φ&kàn)起來(lái)不(bù)起眼兒(ér),實則很(hěn)重>☆∞♦要(yào)。

NS_OPTIONS和(hé)OptionSetType

位操作(zuò)枚舉(bitwise enumeration)與數(shù)λλ組風(fēng)格的(de)語法相(xiàng)結合,而不(bù•&)使用(yòng)管道(dào)符“ | &rdquoπ"÷←;按位操作(zuò),并且具有(yǒu)所有(>↓δ×yǒu)範圍的(de)集合操作(zuò)"→★↕功能(néng)。檢查一(yī)下(xià)×ε®是(shì)否具有(yǒu)contains"£功能(néng)的(de)标志(zhì),或能(néng)夠→∏執行(xíng)像isSubsetOf和(hé)isDisjointWith等© 這(zhè)樣集合操作(zuò)的(de)其他(λ∞tā)功能(néng)。這(zhè)是(s ✔✘ hì)顯著的(de)改進,表達了(le)不(bù)直接對(d•§•✘uì)位進行(xíng)操作(zuò)的(de)意願。

這(zhè)種變化(huà)意味著(zhe)∑✘σ↕位操作(zuò)枚舉實際上(shàng)不(bù)再是(shì)枚舉 ↕↕了(le)。将這(zhè)些(xiē)位操作(zuò)枚ε±舉聲明(míng)為(wèi)結構體(tǐ),實現(xiàn)OptionSΩ₹™etType協議(yì),提供rawValu↑ e屬性。并且創建值作(zuò)為(wèi)結構體(tǐ)的(de)靜(jì✔εng)态成員(yuán)。Swift便會(¥☆huì)搞定其餘的(de)一(yī)切,自(zì)動提供所有(yǒuφ​≤¥)集合的(de)操作(zuò)。這(zhè)是(shì>§Ω)我希望将來(lái)看(kàn)到(dà×σ÷o)的(de)更加明(míng)了(le)的↔‌(de)語法內(nèi)容。

協議(yì)擴展

協議(yì)如(rú)今可(kě)以被擴展了(le),包括與類型約束有™₹(yǒu)關的(de)通(tōng)用(yòng)協議(yì)。還(hái)可π♥$(kě)以自(zì)己提供協議(yì)的(ε↕₩de)默認實現(xiàn)。

先前,你(nǐ)不(bù)能(néng)你(n¶×φǐ)說(shuō):“我要(y¶≥↓×ào)使用(yòng)方法X來(lái)擴展Colle↓"≤ctionType,但(dàn)隻有(yǒ♥✘u)集合中的(de)類型滿足某些(xiē)條件(jiàn)才可(kě§¥)以”。現(xiàn)在,你(nǐ)可(kě)以這(zhè'φπδ)麽做(zuò),并且很(hěn)多(duō)像map,filter和±≤♣→(hé)sort這(zhè)樣的(de)全局函數(shù)已♣↕λ♣經進行(xíng)了(le)擴展。

這(zhè)樣就(jiù)解決了(le)很(hěn)多(duō)痛點 ₩€,這(zhè)也(yě)是(shì)值得(de)單‌↑α獨成文(wén)的(de)內(nèi)容。同時(shí),要<‍(yào)看(kàn)看(kàn)WWDC的(de)面向協議(yì)編程™&¶(Protocol Oriented ProgrammΩ↕♥★ing)了(le)解一(yī)些(xiē)細節。

API審計(jì)

大(dà)量的(de)API已經進一(y•‍ī)步進行(xíng)了(le)審計(jì∞₽π←)而更合理(lǐ)。舉幾個(gè)例子(zǐ):

 

 

用(yòng)translatesAuto±±÷resizingMaskToConstraints = f&"λ​alse代替了(le)setTranslatesAutores€↕izingMaskToConstrains(false)。

Availability屬性

@available屬性自(zì)Swift 1.2就(jiù)'$<£存在了(le)并且後續支持得(de)很(hěn)好(hǎo)。添¶γ≥加了(le)一(yī)個(gè)新的(de)陌生(shēng)語法if#avaφ®γilable(),為(wèi)處理(lǐ)版本檢查提供了(le)支持β→÷。而不(bù)是(shì)插入你(nǐ)喜歡的(de)方法。

遺憾的(de)是(shì)你(nǐ)不(bù)能(nén↕™>g)隻聲明(míng)一(yī)個(gè)屬性UISea≈≠rchController并将target設置•✘為(wèi)iOS 7,然後隻允許訪問(wèn)類中的(de)屬性。Swi '©σft希望整個(gè)類的(de)定義都(dōu)可(kě)以或者不(bù)可(γ$kě)以。

也(yě)可(kě)以不(bù)再采用(yòng)協議(yì),除¶φ₹♣非支持target設置中所有(yǒu)的(de)操作(zuò)系統版本,除非将←ε整個(gè)類标記為(wèi)隻在更新的(de)操作↑✘$(zuò)系統版本可(kě)用(yòng)。

這(zhè)意味著(zhe)使用(yòng)if #a​£δvailable()存在單獨的(de)子(zǐ ♦≈$)類和(hé)對(duì)創建适當對(duì)象的(de)保護。≠≤α¶

盡管如(rú)此,我個(gè)人(rén)還(hái)是(shì©  )發現(xiàn)了(le)一(yī)個(g  ∏è)Bug,應用(yòng)在iOS 4.0§∏•-4.1發生(shēng)崩潰,由于編譯器(qì)沒有(yǒu)發出警←↔÷告,方法隻在iOS4.2才引入,因此我猶如(rú)與定時(shí)炸彈相(xi≤&àng)伴。

C函數(shù)指針

Swift現(xiàn)在可(kě)以使用(yòng)C函數(shù)指針¥ ®,CFunctionPointer已不(bù)複存±♦÷在。任何全局函數(shù),嵌套函數(shù)和•≤δ¶(hé)不(bù)捕獲狀态的(de)閉包都(dōu)可(kě)φ↔φ以作(zuò)為(wèi)一(yī)個(gè)C函數(shù)指針直接傳遞。Ω 你(nǐ)也(yě)可(kě)以調用(yòng)來(lái)自(zì)C程  £☆序的(de)函數(shù)。

你(nǐ)可(kě)以顯示地(dì)使用(yòng​✔Ω)新屬性@convention(c),表示函數(shù)應該使用(yòng)CΩ♠β調用(yòng)約定,簡單痛快(kuài)!盡管我想不(bù)出∞↑₽¶在此對(duì)塊(block)的(de)支持有(yǒu)何用(yòγ★•​ng),作(zuò)為(wèi)所發生(≤≠& shēng)變化(huà)的(de)一(yī)部分(fē →≥n),@objc_block也(yě)被删掉σ ✔‌了(le),使用(yòng)@convention(block♥β)取而代之。@convention(swif₩$t)默認支持所有(yǒu)函數(shù)和(hé)閉包。

這(zhè)并不(bù)是(shì)編程語言所特有(yǒu)的(d₩↑<e)。iOS 9含有(yǒu)不(bù)同版本的(de)Swift标準庫,并¥$且在未來(lái)系統中将添加修正後的(de)Swif♦ ±t标準庫。結合新的(de)App Thining技(jì)術(♥•₩shù),下(xià)載過程中蘋果商店(diàn)會(huì)将Swift标準★Ω≤庫剝離(lí)出去(qù)的(de)。我仍然在 ∞★→追根溯源地(dì)探求這(zhè)究竟是(s±εhì)如(rú)何工(gōng)作(zuò)的(de)。

遺漏

明(míng)顯的(de)一(yī)個(gè)遺漏是(shì)處理(lǐ≤ ↓÷)異步代碼。

蘋果公司為(wèi)我們提供了(le)GCD,這(zhè)是∏★∞§(shì)一(yī)個(gè)強大(dà)的(de)基礎類庫,可 ★←(kě)以構建很(hěn)多(duō)異步操作(zuò)和(hé)并發原語↔✔÷​。

然而,這(zhè)些(xiē)天我們做(zuò)的(de)α  每件(jiàn)事(shì),構建用(yòng)戶接口和(héαγ↔)API都(dōu)需要(yào)考慮異步性和(hé)并發性。我們把一(yī)•$™個(gè)文(wén)件(jiàn)讀(dú)操作(zuò)鎖定一(yī)段時←∏Ω(shí)間(jiān),對(duì)用(yòng)戶來(lái‍‍★)說(shuō)整個(gè)世界就(jiù)都(d★♠•♠ōu)靜(jìng)止了(le)。

這(zhè)是(shì)個(gè)持續的(de)痛¶< 點,不(bù)是(shì)多(duō)大(dà)的<±φ₽(de)事(shì)兒(ér),但(dàn)如(rú)果經常性地(dì)每天∞γ‍重複,恐怕也(yě)是(shì)不(bù)行(xíng)的(de)。€‍✘₩

C#和(hé)JavaScript都(dō¶₽u)采用(yòng)了(le)async/awaitβ∑ε∞來(lái)為(wèi)異步代碼提供一(yī)流的(de)語言支持。₩↓¶我想很(hěn)多(duō)人(rén)都('✘∞±dōu)想知(zhī)道(dào),Swift會(huì)提供什(shé€★¥≥n)麽樣的(de)語法糖來(lái)幫助我們在實現(xiàn§Ω)異步操作(zuò)方面确保正确性。我不(bù)知(zhī)道(dΩ×'ào)在Swift 2.0發布的(de)時(shí)間(jiān)框架內(☆ε‌Ωnèi)是(shì)否會(huì)看(kà ★¶'n)到(dào)什(shén)麽,但(dàn"​₩)願能(néng)有(yǒu)好(hǎo)的(de)​©σ≈東(dōng)西(xī)出現(xiàn)吧(ba)!

開(kāi)放(fàng)源碼

宣布的(de)內(nèi)容中,反響最強烈的(↑α"de)無疑是(shì)Swift開(kāi)放(fàng)源代碼。蘋果公 ' 司已經承諾在今年(nián)底前開(kāi)放(fàng)源碼,我們也(yě® )沒有(yǒu)理(lǐ)由對(duì)此表示懷疑。與蘋果公司®®&•編譯器(qì)團隊成員(yuán)討(tǎo)論過程中,他∞'∏(tā)們看(kàn)起來(lái)似乎對(duì✔ )此由衷地(dì)興奮,無論如(rú)何堅決要(yào)幹成這(zhè)件(j$♠iàn)事(shì)(我有(yǒu)點小(xiǎo)失×±望,他(tā)們沒有(yǒu)打造出經典的(d'→e)蘋果然後宣布開(kāi)源,但(dàn)我仍然對(duì)此消息發自(₹™zì)內(nèi)心地(dì)感到(dào)©₽高(gāo)興)。

結論

Swift 2.0有(yǒu)很(hěn)多(duō)令人(rén)σ♣ε喜愛(ài)之處。蘋果公司的(de)Swift團隊向大(dà)家(jiā)®λ≥承諾他(tā)們會(huì)迅速行(xíng)動。到(dào)目前© 為(wèi)止這(zhè)些(xiē)承諾已經被兌現(xiàn)δ§。成為(wèi)蘋果平台上(shàng)的(♣♠de)開(kāi)發人(rén)員(yuán)是(shì)一(yī)個(gè←¥¶)激動人(rén)心的(de)時(shí)刻。