2016-09-14 13 views
10

にエラー「リ​​テラル空のコレクションには、明示的な型を必要とする」私は私のクラスの変数を持ってSwift3

func chargeData (data: NSArray){ 
    list = data 
} 

それは働いていましたよくSwift 2.3での私のプロジェクトではなくとき、私はそれが私に次のエラーを与えるSwift3XCode8にそれを更新しています

Empty collection literal requires an explicit type

はので、私は私のリスト変数に型キャストを追加しました:

var list = [] as! NSArray 

が、それは私には、次の警告提供します:

Forced cast of 'NSArray' to same type has no effect

私は警告がアプリケーションを壊していませんが、私はということを知っているがこのエラーを適切な方法で解決するのが好きです。

誰かが同じエラーを受け取り、正しく解決しましたか?

ありがとうございます!暗黙的な変換が廃止されているので、あなたは、コンパイラに(ArrayLiteral[]の)明示的な型を指示する必要がありますので、

+1

あなたは 'var list:NSArray = []'を実行する必要があります。別のものに置き換えても大丈夫です。しかし、それは*変更可能なものではないので、 'var list:NSMutableArray = []'はおそらくもっと良いでしょう。 – Moritz

+0

@EricAyaそれ自体が変更可能ではないという事実はどういう意味ですか?私はそれがその値を変えることができるということを知っていますが、私は本当に "変化可能なもの"とはどういう意味ですか? –

+0

コード別に、その答えが異なります。 var/letとNSArray/NSMutableArrayです。 – Moritz

答えて

20

このエラーが発生します。

var list: NSArray = [] 
// or 
var list = [] as NSArray 
1

あなたがObjectiveC(NSArray)とスウィフト(Array<T>)を混合しています。 NSArray内の項目はNSObjectとそのサブクラスとみなされますが、Swiftは配列が空であるため型推論が機能しないため、Tが何であるかを知りません。

あなたはこのようにそれを宣言する場合:

var data: NSArray = [] 

varので、競合が存在しますスウィフトに可変を意味するが、NSArrayはにObjCで不変です。あなたはNSArrayのサブクラスである、NSMutableArrayにそれを変更することにより、その周りを取得することができます:

let data = NSMutableArray() // note that we don't need var here 
          // as NSMutableArray is already mutable 

あなたはそれをタイプを与える、スウィフトのArrayとしてdataを維持したい場合:

var data = [MyDataModel]() 
// or 
var data = [AnyObject]() 

// usage: 
chargeData(data: data as NSArray) 
0

更新SWIFT 4 :

var array = [] as [String]