2016-11-27 5 views
1

ich nach Artikeln gleich oder kleiner als Null in meiner Abfrage wie so aussehen bin versucht .....<= Operand fragt nach dem erwarteten Typ in Swift?

for zeroItems in snapshot.value as! NSDictionary where zeroItems.value["Value"] as! Int <= 0 

Ich erhalte ein Expected type Fehler. Bitte erläutern und zeigen Sie mir, wie Sie korrigieren können.

+1

Warum verwenden Sie NSDictionary in Swift ?! – Alexander

+0

@AlexanderMomchliov Ich habe NSDictionary verwendet, weil Daten von Firebase stammen. –

+1

Das ist in Ordnung, wirf es einfach auf ein natives Swift-Wörterbuch und du erhältst sofort alle Vorteile der nativen Swift-Typen. – Alexander

Antwort

1

Mit ziemlicher Sicherheit haben Sie Any überstrapaziert, wenn Sie diese vielen as! Casts in einer einzigen Zeile verwenden müssen. Erstellen Sie eine benutzerdefinierte Struktur für diesen Typ und konvertieren Sie die Daten in diese. Wenn Sie um NSDictionary herumgehen und as! sehr viel verwenden, kämpfen Sie das System.

Das gesagt, um dies zu tun, brauchen Sie wahrscheinlich nur mehr Klammern. Etwas wie:

for zeroItems in (snapshot.value as! NSDictionary) where (zeroItems.value["Value"] as! Int) <= 0 

Aber das ist schrecklich Swift, vermeiden so das, wenn möglich.

+0

Warum ist es so wichtig für uns Foundation Datatypes in Swift ?! Es fügt so viel unnötige Komplexität hinzu, aber die Leute tun es immer noch. Ich verstehe es nicht! – Alexander

2

Sie sollten in Erwägung ziehen, filter anzuwenden, um die Logik so zu vereinfachen, dass nur Elemente mit weniger als Null berücksichtigt werden. Ich habe ein funktionierendes Beispiel in der IBM Swift Sandbox erstellt.

import Foundation 

// Construct the data structure with demo data 
struct Snapshot { 
    let value: NSDictionary 
} 

let dict: NSDictionary = [ "a" : -1, "b" : 0, "c" : 1] 
let snapshot = Snapshot(value: dict) 

//Apply a filter 
let zeroItems = snapshot.value.filter{Int($0.1 as! NSNumber) <= 0} 

//View the result 
print(zeroItems) 
1

Sie Interpretation snapshot.value als Wörterbuch, so zeroItems ein Tupel von Schlüssel und Wert. Wie ich Sie verstehe Array von Wörterbüchern, und Sie möchten sie mit "Value" -Schlüssel, richtig?

Wenn ja, dann können Sie folgenden Code verwenden:

// dictionary with Value key, and Int value 
let dict: [String: Any] = ["Value":-1] 
// array of dictionaries 
let value: [[String: Any]] = [dict, <**add here as many as you want**>] 


// get only array of integeres 
let onlyIntegers = value.flatMap { $0["Value"] as? Int }.filter {$0 <= 0 } 
print(onlyIntegers) 


// get array of dictionaries which passes <=0 check 
let onlyLessOrEqualTo0 = value.filter { dict in 
    if let value = dict["Value"] as? Int { 
     return value <= 0 
    } 
    return false 
} 
print(onlyLessOrEqualTo0) 
0

Zu allererst wird dazu beitragen, einige Klammern Hinzufügen zu sehen, wo das Problem liegt:

for zeroItems in myDict as! NSDictionary where (zeroItems.value["Value"] as! Int) <= 0 

Jetzt bekommen wir „Typ" Jeder hat keine tiefgestellten Mitglieder. Das Problem ist also, dass man nicht Swift haben gesagt, was die Art der zeroItems ‚s-Wert ist, was ich denke, ist ein Wörterbuch, aus dem Code zu urteilen:

Dies kompiliert für mich:

for zeroItems in myDict as! Dictionary<String, Dictionary<String, Int>> where zeroItems.value["Value"]! <= 0 

Das ist jedoch nicht schön. Sie könnten wahrscheinlich besser lesbaren Code mit filter bekommen, wie in einer anderen Antwort vorgeschlagen wurde.

Verwandte Themen