2014-09-26 25 views
15

什麼是這兩個代碼段之間的區別:在Swift中使用as和as進行向下轉換?

let cell = tableView.dequeueReusableCellWithIdentifier("cellId") as UITableViewCell? 
// vs 
let cell = tableView.dequeueReusableCellWithIdentifier("cellId") as? UITableViewCell 

是沒有結果完全一樣?

+0

'作爲UITableViewCell?'導致Swift 2中的編譯錯誤AnyObject?不能轉換成UITableViewCell?' – onmyway133 2015-09-23 16:12:53

回答

14

在該代碼中沒有區別,在這兩種情況下,它的計算結果爲UITableViewCell?

的真正區別是:

  • 在第一種情況下向下轉換到UITableViewCell?

    有望總是成功(即使它是零),所以如果dequeueReusableCellWithIdentifier返回的東西不是UITableViewCell的實例(或從它繼承的類的實例),它在運行時會失敗。表達式返回一個可選UITableViewCell?

  • 在第二種情況下

    鑄造是可選的:如果由dequeueReusableCellWithIdentifier返回的對象既不是UITableViewCell一個實例,也不是子類的實例,喪氣擺好評估爲nil(因此與沒有運行時錯誤)。

當然dequeueReusableCellWithIdentifier總是返回UITableViewCell,這就是爲什麼有一個在你的代碼沒有區別。但在其他情況下,可能會存在差異,您必須注意以防止運行時錯誤

+1

+1以這種精心的方式解釋它。 – 2014-09-29 11:02:28

6

asas?之間的主要區別是as被強制轉換,並且如果失敗將會崩潰。 as?如果投射成功,將返回包含值的可選值,如果不成功則返回nil

+0

這是否意味着'as'和'as !'是一樣的? – 2015-11-04 13:06:53

+0

@ BR41N-FCK這在Swift 2.0中有所變化,''只有在沒有失敗的機會時纔有效(如果不允許的話,你會得到編譯時錯誤)。 'as!'被稱爲強制轉換,如果在運行時不可能轉換,將會崩潰。 – Kirsteins 2015-11-04 13:10:53

+0

有沒有比較三個更好地掌握他們之間的細微差別? – 2015-11-04 16:21:09

1

asas?之間的差異

  • as? UITableViewCell意味着,當你不知道你downcasting,我們假定你是什麼,作爲一個UITableViewCell,但它可能我IntegerFloatArrayDictionary

  • as UITableViewCell?表示這是一個Optional Value,它可能包含UITableViewCellNil值。