2016-03-20 9 views
0

次の行がコンパイルされ、迅速に動作するのはなぜですか?同じタイプの迅速なタイプをキャストするのはなぜですか?

employeeListing.text = (jumperCablesRoles[row] as! [String] as [String]).joinWithSeparator("...") 

私は文字列の配列を、まったく同じことだと思う文字列にキャストしているようです。それは動作しますが、私はなぜ、誰かがこれを説明できるのか分からないのですか?

答えて

0

[OK]をクリックして、コードといくつかのポイント:あなたがアンラップ力(鋳造)jumperCablesRoles[row]は、文字列の配列としてあるよう

まず、jumperCablesRoles[row] as! [String]は、スウィフトに潜在的に危険な行為です。ポニーを保存する方法の詳細はhereをご覧ください。

より良い解決策のようなものになります:

if let role = jumperCablesRoles[row] as? [String] { 
    employeeListing.text = role.joinWithSeparator("...") // role is guaranteed to be an Array of Strings. Safe to operate on it. 
} else { 
    // jumperCablesRoles[row] is not an array of strings, handle so here. 
} 

これは、あなたがそれを扱うことができない場合jumperCablesRoles[row]は、爆破せずに、文字列の実際の配列であることを確認します。

もそうようjumperCablesRolesの種類を指定することができますをキャストあなたを停止するには:についての質問に答えるために、

employeeListing.text = jumperCablesRoles.joinWithSeparator("...") 

第二:これはあなたのように直接jumperCablesRolesを使用することができるようになる

jumperCablesRoles: [[String]] = [] 

文字列の配列を文字列の配列にキャストします(... as! [String] as [String])。このコード行で基本的に言っていることは次のとおりです。

let role = jumperCableRoles[row] as! [String] // role is an Array of Strings 
let role2 = role as [String] // Specifying an object as an Array of Strings when it already is an Array of Strings. Which is trivial. 
+1

'!'はコンテキストによって潜在的に危険です。あなたのデータ型について確信があるなら、 '!'を使うのは良いスタイルです。 – Sulthan

+1

それでは、先に述べたように手前の型を指定して、最初に危険を否定するのはなぜですか? – AJ9

関連する問題