2017-01-06 5 views
0

私はこのような辞書を作成しようとしています:は種類の辞書にUInt64型を追加することはできません:[文字列:?ANYOBJECT]

func someFunc() -> [String : AnyObject?] { 
    var dic = [ 
      "Name": someString_Variable, 
      "Sum": someUInt64_Variable 
     ] 

問題は、私はsomeUInt64_Variableを追加したとき、私はエラーを取得する次のとおりです。

Cannot convert value of type UInt64 to expected dictionary value type Optional<AnyObject> 

ここで何をすればいいですか?UInt64Stringに変換できません。
なぜこのエラーが発生するのですか?

+1

辞書を使って既知のキーの有限集合を値にマップするだけであれば、代わりにそのデータを表現するためのモデル 'struct'を作るべきです。 – Hamish

+1

いつものように、オプションの辞書値は意味がありません。なぜなら、定義によってnil値がキーが欠落していることを示しているからです。 – vadian

+0

申し訳ありませんが、私はまだ何をすべきか理解していません。私は型を '[String:AnyObject]'に変更しようとしましたが、それでも動作しません。 – 1110

答えて

1

スウィフトタイプがファンデーションタイプに自動的にブリッジされたとき、以前のバージョンのSwiftでこれを使用していました。今、その機能が削除されていることを、あなたは明示的にそれをしなければならない。

あなただけ明示的AnyObjectにそれらをキャストすることができます:

let dic : [String: AnyObject?] = [ 
    "Name": someString_Variable as AnyObject, 
    "Sum": someUInt64_Variable as AnyObject 
] 

とスウィフトは財団種類StringためNSStringNSNumberに変換しますUInt64の場合。

あなただけのこれらの型に自分自身をキャストする場合、それは明確であるかもしれない:

let dic : [String: AnyObject?] = [ 
    "Name": someString_Variable as NSString, 
    "Sum": someUInt64_Variable as NSNumber 
] 
+0

これは、任意の型である 'Any'とクラスからのオブジェクトである' AnyObject'との間に違いがあるためです。構造体は 'AnyObject'ではありません。 'UInt64'は構造体なので、変換は明示的に行わなければなりません。詳細については、[ここ](https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/TypeCasting.html#//apple_ref/doc/uid/TP40014097-CH22-ID342)を参照してください。実際には、OPが最初に「Any」を使用する方が良いかもしれません。 – BallpointBen

+0

@BallpointBen、それは 'Any'と' AnyObject'の違いが*常に*あります。 Swiftチームは 'String'sと' Int'sの* Foundation *型への自動変換を削除しました。この辞書を 'NSDictionary'を取る* Cocoa Touch *フレームワークに送るつもりなら、' [String:Any] 'はそれをカットしません。 – vacawama

+0

ああ、それは分かりませんでした。ありがとう。 – BallpointBen

0

本当にここが起こっているかを理解することが重要です。それは単にオブジェクトではないのでInt64AnyObjectに互換性がありません。

someUInt64_Variable as NSNumberのようなFoundationタイプにブリッジすることで、Int64をオブジェクトにラップすることができます。新しいNSNumberオブジェクトが割り当てられ、Int64がその中に格納されます。

おそらく、あなたが本当にAnyObjectが必要ですが、通常、あなたがこのケースでAnyを使用します。

func someFunc() -> [String : Any] { 
    var dic = [ 
      "Name": someString_Variable, 
      "Sum": someUInt64_Variable 
     ] 

これは、より良い性能(追加なしヒープ割り当て)を提供し、あなたは財団ブリッジングに依存しません。

関連する問題