plist Werteliste mit Datumsangaben filtern geht nicht.

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Erstmal ein grosses Danke an alle, die sich hier Zeit nehmen! Wie man unschwer merkt, bin ich noch ein totaler Neuling in der Welt von Swift. Probiere gerade diverse Dinge aus, um ein besseres Verständnis dafür zu bekommen. Das mal vorab. :)

    @matz Nun, ich habe mir deine Überarbeitung einmal angeschaut und bei mir reinkopiert. Bei mir wird immer die Fehlermeldung "unexpected Thread" angezeigt. Ich habe 2 Vermutungen, an was es liegen könnte.

    1. Die .plist im Projekt enthält zwar die verschiedenen Daten (ex. 05.05.2009), aber diese sind als string drin und nicht als Datum. Meine Frage dazu: Wie kann man von string auf date innerhalb weniger Sekunden für ca. 1800 Datensätze ändern?
    2. Ich habe in deiner Funktion den Namen der .plist nicht richtig angepasst.


    Des weiteren nimmt mich noch etwas wunder. Sofern ich es richtig verstanden habe, ist mit deinem Code möglich, die Daten nach belieben aus der Liste zu ziehen und anschliessend einen Dollarbetrag auszuwählen, allerdings sucht man nicht automatisch an den an das Datum verknüpften Dollarkurs, richtig?


    Step: Angenommen die ganze Funktion geht, kann ich dann einfach das wählbare Datumdrehrad (siehe in meinem Projekt) einfügen, Datum auswählen und in einem weiteren Feld Betrag y eingeben (also sofern ich das mit der Funktion verknüpfe)?


    Danke euch und einen schönen Abend.
    Dateien
    • whatifbtc.zip

      (81,58 kB, 219 mal heruntergeladen, zuletzt: )
  • torquato schrieb:

    Michael schrieb:

    Die Zeile

    let finalData = arrayFromPlist

    ist eigentlich überflüssig.
    Ähhh… Jein. if let some = try? optionalProducingExpression reduziert aktuell leider keine doppelten Optionals. Da ist gerade ein Proposal in der Mache, das hoffentlich durchkommt: Make try? + optional chain flattening work together
    @matz hat hier vorbildlich da rumgearbeitet! ;)
    Jetzt, wo,du das sagst. Da sage mal noch einer, Swift wäre „easy to read“. Der zweite Optional ist mir durch den Zeilenumbruch glatt nicht aufgefallen.
  • Jetzt, wo Du das sagst. Die Stelle wäre wohl verständlicher, bzw. 'lesbarer' gewesen, wenn @matz statt

    Quellcode

    1. let arrayFromPlist = try? PropertyListSerialization.propertyList(from:data, options: [], format: nil) as? [[String: Any]],
    2. let finalData = arrayFromPlist
    hier

    Quellcode

    1. let arrayFromPlist = try? PropertyListSerialization.propertyList(from:data, options: [], format: nil),
    2. let finalData = arrayFromPlist as? [[String: Any]]

    geschrieben hätte. ;)
    Das iPhone sagt: "Zum Antworten streichen". Wie? Echt Jetzt? Muß ich erst die Wohnung streichen!?
  • MCDan schrieb:

    Ich erkenne an dem ganzen Code Wirrwarr immer noch nicht den Vorteil von Swif gegenüber Objective-C. Der Compiler schluckt ohne Murren alles und zur Laufzeit gibt es dann eine Exception.

    Worin liegt darin jetzt die Verbesserung gegenüber Objective-C?
    Lass es doch wenn du zum Thema nix hast. Ich bin auch kein riesen Swift Fan, versuche aber wenigstens ein bisschen zu helfen ^^

    Und ja, objective c bleibt auch mein Favorit
  • torquato schrieb:

    Jetzt, wo Du das sagst. Die Stelle wäre wohl verständlicher, bzw. 'lesbarer' gewesen, wenn @matz statt

    Quellcode

    1. let arrayFromPlist = try? PropertyListSerialization.propertyList(from:data, options: [], format: nil) as? [[String: Any]],
    2. let finalData = arrayFromPlist
    hier

    Quellcode

    1. let arrayFromPlist = try? PropertyListSerialization.propertyList(from:data, options: [], format: nil),
    2. let finalData = arrayFromPlist as? [[String: Any]]
    geschrieben hätte. ;)
    man lernt ja noch
  • So, anbei noch die "Swiftigere" Versin :)


    C-Quellcode

    1. struct Entry: Codable {
    2. let price: Int
    3. let date: String
    4. }
    5. typealias Entries = [Entry]
    6. class ViewController: UIViewController {
    7. override func viewDidLoad() {
    8. super.viewDidLoad()
    9. print(filterForDate("05.05.2018"))
    10. }
    11. func swiftArrayFromPlist(name: String) -> Entries {
    12. guard
    13. let url = Bundle.main.url(forResource: name, withExtension: "plist"),
    14. let data = try? Data(contentsOf: url)
    15. else {
    16. fatalError("Something went wrong")
    17. }
    18. let decoder = PropertyListDecoder()
    19. guard let result = try? decoder.decode(Entries.self, from: data) else {
    20. fatalError("Could not convert to entry")
    21. }
    22. return result
    23. }
    24. func filterForDate(_ date: String) -> Entries
    25. {
    26. let array = swiftArrayFromPlist(name: "date")
    27. return array.filter { $0.date == date }
    28. }
    29. }
    Alles anzeigen
    Hier musst du aber drauf achten, dass deine plist passt, du hast gelegentlich

    <date> als value und mal <string> als value, in meinem Beispiel muss alles <string> sein
  • matz schrieb:

    So, anbei noch die "Swiftigere" Versin :)
    Liest sich gut und sieht schön kompakt aus. Irgendwann werde ich den Schritt Richtung Swift wohl auch machen ... wenn ich muss :)

    Allerdings habe ich den Eindruck, dass dem OP gar nicht klar ist, wie man ein Datenmodell mit einer UI verknüpft. Zumindest vermischen seine Fragen durchgehend Manipulationen der Daten mit der Darstellung in der Benutzer-Oberfläche.

    @Lukas99: Vielleicht versuchst Du in einem Beispiel-Projekt zunächst, die UI auf Basis eines einfachen Arrays an's Laufen zu kriegen, bevor Du ein Datenmodell mit 1.800 Datensätzen aufbaust. Ich zumindest würde mit 2-3 - zur Not per Code zugewiesenen - Werten starten, bevor ich mir Gedanken über die Persistierung machen würde. Bei umfangreicheren Daten ist eine Plist eh nicht das Mittel der Wahl, da ist selbst eine CSV sinnvoller.

    Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.
  • Danke für eure fleissigen Hilfestellungen!

    Ich habe mich heute abend mal weiter schlau gemacht, um herauszufinden, wie man ein Textfeld mit "Datumsrad" einfügt (wenn man das Textfeld anklickt, erscheint das Rad). Ist so halb gegangen... Zeigte schonmal keine Errors an, allerdings ändert sich die Tastatur von normalem Text nicht auf das Rad. Zudem würde es mich interessieren, wie man anschliessend das im Feld eingegebene Datum mit der oberen Funktion verknüpft (die Funktion, die anhand des Datums den Preis heraussucht).


    Quellcode

    1. //
    2. // ViewController.swift
    3. // 1234
    4. //
    5. // Created by Lukas Steiner on 07.06.18.
    6. // Copyright © 2018 Lukas Steiner. All rights reserved.
    7. //
    8. import UIKit
    9. class ViewController: UIViewController {
    10. @IBOutlet weak var datePickerTxt: UITextField!
    11. let datePicker = UIDatePicker()
    12. struct Entry: Codable {
    13. let price: Int
    14. let date: String
    15. }
    16. typealias Entries = [Entry]
    17. class ViewController: UIViewController {
    18. override func viewDidLoad() {
    19. super.viewDidLoad()
    20. print(filterForDate("05.05.2018"))
    21. }
    22. func swiftArrayFromPlist(name: String) -> Entries {
    23. guard
    24. let url = Bundle.main.url(forResource: name, withExtension: "plist"),
    25. let data = try? Data(contentsOf: url)
    26. else {
    27. fatalError("Something went wrong")
    28. }
    29. let decoder = PropertyListDecoder()
    30. guard let result = try? decoder.decode(Entries.self, from: data) else {
    31. fatalError("Could not convert to entry")
    32. }
    33. return result
    34. }
    35. func filterForDate(_ date: String) -> Entries
    36. {
    37. let array = swiftArrayFromPlist(name: "date")
    38. return array.filter { $0.date == date }
    39. }
    40. }
    41. func createDatePicker() {
    42. //format for picker
    43. datePicker.datePickerMode = .date
    44. //toolbar
    45. let toolbar = UIToolbar()
    46. toolbar.sizeToFit()
    47. //bar button Item
    48. let doneButton = UIBarButtonItem(barButtonSystemItem: .done, target: nil, action: #selector(donePressed))
    49. toolbar.setItems([doneButton], animated: false)
    50. datePickerTxt.inputAccessoryView = toolbar
    51. // assigning date picker to text field
    52. datePickerTxt.inputView = datePicker
    53. }
    54. @objc func donePressed() {
    55. // format date
    56. let dateFormatter = DateFormatter()
    57. dateFormatter.dateStyle = .short
    58. dateFormatter.timeStyle = .none
    59. datePickerTxt.text = dateFormatter.string(from: datePicker.date)
    60. self.view.endEditing(true)
    61. }
    62. }
    Alles anzeigen
    Gruss und eine gute Nacht. :)