2016-09-14 6 views
10

Mam zmienną w mojej klasie:„Puste kolekcja dosłowne wymaga wyraźnego typu” błąd na Swift3

var list = [] 

i używam go na funkcję mojej klasy:

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

to działało dobrze na moim projekcie w Swift 2.3 ale kiedy zaktualizowaniu go do XCode8 i Swift3 daje mi następujący błąd:

Empty collection literal requires an explicit type

więc dodałem typecast do mojej listy zmiennej:

var list = [] as! NSArray 

ale daje mi następujący alert:

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

wiem, że wpis nie złamał aplikacji, ale chciałbym lubię rozwiązać ten błąd we właściwy sposób.

Czy ktoś miał ten sam błąd i rozwiązał go poprawnie?

Z góry dziękuję!

+1

Będziesz musiał wykonać 'var list: NSArray = []'. Jest OK, jeśli po prostu zastąpisz go innym. Ale nie jest to * zmienne *, więc 'var list: NSMutableArray = []' byłoby lepsze, jak przypuszczam. – Moritz

+0

@EricAya Co tak naprawdę znaczysz z tym, że sam się nie zmienia? Wiem, że zmienna oznacza, że ​​może zmienić swoje wartości, ale nie jestem do końca pewien, co masz na myśli mówiąc "sama zmiana". –

+0

CodeDifferent wyjaśnia to w swojej odpowiedzi. var/let i NSArray/NSMutableArray. – Moritz

Odpowiedz

20

Ten błąd występuje, ponieważ konwersje niejawne są zniesione, więc trzeba poinformować kompilator wyraźnej typ (z ArrayLiteral[]):

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

Jesteś mieszanie ObjectiveC (NSArray) i Swift (Array<T>). Zakłada się, że elementy wewnątrz obiektu NSArray to NSObject i jego podklasy, natomiast Swift nie ma pojęcia, co to jest T, ponieważ tablica jest pusta, a zatem wnioskowanie typu nie działa.

Jeśli zadeklarujesz to tak:

var data: NSArray = [] 

nastąpi konflikt od var oznacza zmienny w Swift, ale NSArray jest niezmienna w ObjC. Można obejść, że zmieniając go NSMutableArray, który jest podklasą NSArray:

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

Jeśli chcesz zachować data jak Swift Array, nadać jej typ:

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

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

Aktualizacja Swift 4 :

var array = [] as [String] 
Powiązane problemy