4

ここに私のテストコードがあります:

var myDict: [String: AnyObject] = ["k":"v"]

var a = myDict["k"]
var b = a as String

var c = myDict["k"] as String

Xcode6-beta6 での私の Swift プレイグラウンドは次のとおりです。

遊び場

型推論のルールによれば、c論理的に矛盾することについて文句を言うことは、文句を言わないことではありませんbか?

4

3 に答える 3

1

これは、 に2 つの添字オーバーロードDictionaryがあるという事実に関係しています。

subscript (key: Key) -> Value?
subscript (i: DictionaryIndex<Key, Value>) -> (Key, Value) { get }

1 つ目は、キーを渡すおなじみのもので、オプションの値が与えられます。キーに値を設定するために使用できます。

2 つ目はあまり一般的ではありません。はDictionaryIndex一種の辞書への反復子であり、それを添え字として使用して、その反復子でキーと値のペアを直接取得できます。

コンパイラが一致するオーバーロードを見つけられない場合 (この場合、最初のオーバーロードは、非オプションにキャストできないオプションを返すため一致しませんString)、任意に 1 つを選択します(まあ、任意のようです)。とにかく私に)エラーに表示します。この場所では、認識できない 2 番目のものを選択します。そのため、エラーは奇妙に思えます。

于 2014-08-25T05:04:16.090 に答える
0

これは機能します。

var c = myDict["k"] as AnyObject! as String   // "v"

あなたの質問に答えるために、Swift が不平を言う理由は、これら 2 つの変換を一度に行おうとしている可能性があります。ステートメントvar a = myDict["k"]には暗黙的な変換が既に含まれていることに注意してください。暗黙の変換はAnyObject?であるため、上記は次のようにも機能します。

var c = myDict["k"] as AnyObject? as String   // "v"

"k"キーが定義されていない場合、上記は実行時エラーにつながることに注意してください。nilにキャストすることで、これを返すことができますString?

于 2014-08-24T21:46:55.900 に答える