2017-09-21 3 views
1

Also ich habe gerade begonnen zu lernen "swift" für ein Projekt, das ich mache, und ich bin auf ein ziemlich interessantes Szenario gestoßen und ich kann nicht herausfinden, warum es passiert.Swift String-Vergleich fehlgeschlagen

Also der grundlegende Kern meines Projekts ist wie folgt: Ich habe eine SQLite-Datenbank der Landesgesetze, die im Grunde eine Excel-Tabelle mit 4 Spalten ist; Abschnitt, Gesetz, Hinweis, Tag. Und all meine App lädt diese Datenbank auf das Telefon des Benutzers oder den Simulator und erlaubt dem Benutzer, nach einem Gesetz zu suchen, das auf den Tags basiert. Mehrere Gesetze können dasselbe Tag haben, in diesem Fall würde ich eine Vorschau aller Gesetze mit einem solchen Tag anzeigen und den Benutzer auswählen lassen.

Hier mein Viewcontroller ist, dass diese Tag-Suche Griffe:

import UIKit 
import MessageUI 
import SQLite 


class UISearchController: UIViewController, UIPickerViewDataSource, UIPickerViewDelegate, MFMessageComposeViewControllerDelegate { 

    var database2: Connection! 
    var table2: Table? 
    var lawTemp: String? 
    let section = Expression<String>("section") 
    let law = Expression<String>("law") 
    let note = Expression<String>("note") 
    let tag = Expression<String>("tag") 

    @IBAction func queryTable(_ sender: Any) { 
     do { 
      print("The chosen tag was: " + String(tagChosen.text!)) 
      let laws = try self.database2.prepare(self.table2!) 
      print("CHECKPOINT 2") 
      for row in laws { 
       print(String(row[self.tag]) == String(tagChosen.text!)) 
       print("because the current law tag is: " + String(row[self.tag])) 
        //print(row[Expression<String>("law")]) 
        lawTemp = row[Expression<String>("law")] 
      } 
     }catch { 
      print(error) 
     } 
     print("QUERY DONE") 

    } 
    @IBOutlet weak var tagChosen: UITextField! 


    @IBAction func sendText(sender: AnyObject) { 
     if (MFMessageComposeViewController.canSendText()) 
     { 
      let controller = MFMessageComposeViewController() 
      controller.body = String(describing: lawTemp) 
      //controller.recipients = [phoneNumber.text!] 
      controller.messageComposeDelegate = self 
      self.present(controller, animated: true, completion: nil) 
     } 
    } 

    func messageComposeViewController(_ controller: MFMessageComposeViewController, didFinishWith result: MessageComposeResult) { 
     //... handle sms screen actions 
     self.dismiss(animated: true, completion: nil) 
    } 

    override func viewWillDisappear(_ animated: Bool) { 
     self.navigationController?.isNavigationBarHidden = false 
    } 

    let tags = [String](arrayLiteral: "Public lands", "Definitions","Natural Resources","Powers","Risk Assesment","Land Disposition","Board Duties") 

    //MARK: - Picker View Data Sources and Delegates 

    func numberOfComponents(in tags: UIPickerView) -> Int { 
     return 1 
    } 
    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { 
     return tags.count 
    } 
    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { 
      tagChosen.text = tags[row] 
     return tags[row] 
    } 
    override func viewDidLoad() 
    { 
     super.viewDidLoad() 

     do { 
      let laws = try self.database2.prepare(self.table2!) 
      for lawl in laws { 
       print("SECTION: " + lawl[self.section]) 
       print("TAG: " + lawl[self.tag]) 
       print("NOTE: " + lawl[self.note] + "\n -----------------------------------------------------------------------------------------") 
       print("LAW: " + lawl[self.law]) 
      } 
     } catch { 
      print(error) 
     } 

     let pickerView = UIPickerView() 
     pickerView.delegate = self 
     pickerView.dataSource = self 
     tagChosen.inputView = pickerView 
    } 
    //override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
     //let dest = segue.destination 
     //let tableViewController = dest as! UILawTableViewController! 
     //tableViewController.table3 = table2 
     //tableViewController.database3 = database2 
    //} 
} 

und hier ist das, was ich bekomme, wenn ich „Natural Resources“, wie meine tagChosen holen, das ist die Ausgabe der Konsole:

The chosen tag was: Natural Resources 
CHECKPOINT 2 
false 
because the current law tag is: 
Definitions 

false 
because the current law tag is: 
Public lands 

false 
because the current law tag is: 
Natural Resources 

false 
because the current law tag is: 
Natural Resources 

false 
because the current law tag is: 
Natural Resources 

false 
because the current law tag is: 
Powers 

false 
because the current law tag is: 
Board Duties 

QUERY DONE 

Es sollte wirklich true für 3 dieser Prüfungen ausdrucken. Und im Idealfall würde ich diese 3 Zeilen dort platzieren, wo es eine Übereinstimmung in einem Array gibt, und diese verwenden, um dem Benutzer die möglichen Gesetze zu zeigen. Kann jemand helfen? Lassen Sie mich wissen, wenn Sie weitere Informationen benötigen.

+0

Sie versuchen, haben String.compare (anotherString: String)? – CZ54

+1

Könnte es sein, dass 'String (row [self.tag])' 'einen abschließenden Zeilenumbruch hat? - Versuchen Sie 'print (String (row [self.tag]). DebugDescription') –

+0

Nur ein Vorschlag: Präfix UI oder andere SDK-Klassenpräfixe nicht Präfix.Es ist besser, wenn Sie eine eigene Konvertierung für die Klassen haben, die Sie erstellen – Rishi

Antwort

1

unsichtbare Zeichen entfernen, wie von Martin sugegsted:

String(tagChosen.text!).trimmingCharacters(in: .whitespacesAndNewlines) == String(row[self.tag])).trimmingCharacters(in: .whitespacesAndNewlines) 
+1

Danke, das hat es behoben. Bearbeiten Sie einfach Ihre Antwort, weil Sie die selbe Zeile (self.tag) 'mit sich selbst vergleichen, wenn sie mit' tagChosen.text! 'Verglichen werden soll :) –

+0

Fertig, können Sie Akzeptieren Sie Antwort/up Abstimmung :) Danke – CZ54

+0

und akzeptieren Sie bitte;) – CZ54

Verwandte Themen