2016-11-30 4 views
3

I [Dictionary<String,Any!>]-[Dictionary<String,Any?>]konvertieren [Wörterbuch <String,Any?>] in [Wörterbuch <String,Any!>]? swift 3

aber ich bekomme immer wieder diese Fehler zu anhängen versuche:

Cannot Convert value of Type [Dictionary] to expected argument type of [Dictionary]

Obwohl ich nicht diesen Compiler-Fehler bekommen haben mit swift2.

Hier ist mein Code:

class A{ 

    var statistics = [Dictionary<String,Any!>](); 

    func1(){ 


     let oldStatiscs = self.func2() 
     //i am getting the error here. 
     self.statistics.append(oldStatiscs) 


    } 

    func2() -> [Dictionary<String,Any?>]{ 


    } 

} 

Warum erhalte ich diesen Fehler auf swift3? Warum erhalte ich diesen Fehler nicht mit swift2? Wie kann dieses Problem gelöst werden?

Dank

+1

Jeder optionale Wert in einem Swift - in Objective-C ist es sogar nicht erlaubt - Dictionary ist unsinnig, weil ein 'nil'-Wert definitionsgemäß einen fehlenden Schlüssel bedeutet und Sie einen Schlüssel durch Zuweisung eines 'nil'-Wertes entfernen können. – vadian

+0

@vadian danke für deinen Kommentar, ja ich weiß, aber derzeit kann ich es nicht ändern, um Wörterbuch . Haben Sie eine Lösung für mein Problem? – david

+1

'[Dictionary ]' ist in Swift 3 als Variablentyp ungültig (es kann nur an einer kleinen Anzahl von Orten existieren). Sie müssen es ändern. Wenn Sie es nicht ändern können, können Sie nicht auf Swift 3 upgraden. Sie sehen die Fehler noch nicht, aber wenn Sie alle anderen Fehler beheben, werden Sie schließlich auf "Implicitly unwrapped optionals sind nur auf höchster Ebene erlaubt und als Funktionsergebnisse. " Du kannst diesen Typ nicht mehr verwenden (in Swift 2 war das Unsinn; in Swift 3 ist es illegal). –

Antwort

3

Zunächst einmal, auch wenn Sie beide Arrays von Wörterbüchern zu [Dictionary<String,Any>] ändern Sie noch einen ähnlichen Fehler. Sie versuchen, ein Array an ein Array anzuhängen. So Sie zuerst ändern müssen:

self.statistics.append(oldStatiscs) 

zu:

self.statistics.append(contentsOf: oldStatiscs) 

Aber auch mit dieser Änderung können Sie nicht ein Array von [Dictionary<String,Any?>] auf ein Array von [Dictionary<String,Any!>] hängen. Die einfachste Lösung besteht darin, das [Dictionary<String,Any!>] Array in ein [Dictionary<String,Any?>] Array zu ändern.

Dann beenden Sie mit dem folgenden Arbeits Code auf:

class A { 
    var statistics = [Dictionary<String,Any?>](); 

    func f1() { 
     let oldStatiscs = self.f2() 
     statistics.append(contentsOf: oldStatiscs) 
    } 

    func f2() -> [Dictionary<String,Any?>] { 
     return [["Hi":"There"]] 
    } 
} 

Noch besser ist es von Any? loszuwerden und Any verwenden.

class A { 
    var statistics = [Dictionary<String,Any>](); 

    func f1() { 
     let oldStatiscs = self.f2() 
     statistics.append(contentsOf: oldStatiscs) 
    } 

    func f2() -> [Dictionary<String,Any>] { 
     return [["Hi":"There"]] 
    } 
} 

Sie müssen erklären, warum Sie denken, Sie nicht Any?-Any ändern können.

Verwandte Themen