什麼是這兩個代碼段之間的區別:在Swift中使用as和as進行向下轉換?
let cell = tableView.dequeueReusableCellWithIdentifier("cellId") as UITableViewCell?
// vs
let cell = tableView.dequeueReusableCellWithIdentifier("cellId") as? UITableViewCell
是沒有結果完全一樣?
什麼是這兩個代碼段之間的區別:在Swift中使用as和as進行向下轉換?
let cell = tableView.dequeueReusableCellWithIdentifier("cellId") as UITableViewCell?
// vs
let cell = tableView.dequeueReusableCellWithIdentifier("cellId") as? UITableViewCell
是沒有結果完全一樣?
在該代碼中沒有區別,在這兩種情況下,它的計算結果爲UITableViewCell?
的真正區別是:
UITableViewCell?
有望總是成功(即使它是零),所以如果dequeueReusableCellWithIdentifier
返回的東西不是UITableViewCell
的實例(或從它繼承的類的實例),它在運行時會失敗。表達式返回一個可選UITableViewCell?
鑄造是可選的:如果由dequeueReusableCellWithIdentifier
返回的對象既不是UITableViewCell
一個實例,也不是子類的實例,喪氣擺好評估爲nil(因此與沒有運行時錯誤)。
當然dequeueReusableCellWithIdentifier
總是返回UITableViewCell
,這就是爲什麼有一個在你的代碼沒有區別。但在其他情況下,可能會存在差異,您必須注意以防止運行時錯誤
+1以這種精心的方式解釋它。 – 2014-09-29 11:02:28
as
和as?
之間的主要區別是as
被強制轉換,並且如果失敗將會崩潰。 as?
如果投射成功,將返回包含值的可選值,如果不成功則返回nil
。
這是否意味着'as'和'as !'是一樣的? – 2015-11-04 13:06:53
@ BR41N-FCK這在Swift 2.0中有所變化,''只有在沒有失敗的機會時纔有效(如果不允許的話,你會得到編譯時錯誤)。 'as!'被稱爲強制轉換,如果在運行時不可能轉換,將會崩潰。 – Kirsteins 2015-11-04 13:10:53
有沒有比較三個更好地掌握他們之間的細微差別? – 2015-11-04 16:21:09
as
和as?
之間的差異
as? UITableViewCell
意味着,當你不知道你downcasting
,我們假定你是什麼,作爲一個UITableViewCell
,但它可能我Integer
或Float
或Array
或Dictionary
。
as UITableViewCell?
表示這是一個Optional Value
,它可能包含UITableViewCell
或Nil
值。
'作爲UITableViewCell?'導致Swift 2中的編譯錯誤AnyObject?不能轉換成UITableViewCell?' – onmyway133 2015-09-23 16:12:53