【问题标题】:Swift string comparison failingSwift 字符串比较失败
【发布时间】:2017-09-21 08:21:09
【问题描述】:

所以我刚开始为我正在做的一个项目“学习”swift,我遇到了一个非常有趣的场景,我不知道为什么会这样。

所以我的项目的基本要点如下:我有一个州法律的 SQLite 数据库,它基本上是一个有 4 列的 excel 表;部分,法律,注意,标签。我的应用程序所做的只是将此数据库预加载到用户手机或模拟器上,并允许用户根据标签搜索法律。多个法律可以具有相同的标签,在这种情况下,我将显示带有此类标签的所有法律的预览,并让用户选择一个。

这是处理此标签搜索的 ViewController:

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
    //}
}

当我选择“自然资源”作为我的tagChosen 时,我得到了以下结果,这是控制台输出:

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

真的应该打印出true 用于其中的 3 张支票。理想情况下,我会将匹配的那 3 行放入一个数组中,并用它来向用户展示可能的规律。任何人都可以帮忙吗?如果您需要更多信息,请告诉我。

【问题讨论】:

  • 你试过 String.compare(anotherString : String) 吗?
  • 会不会是String(row[self.tag]) 有一个尾随换行符? – 试试print(String(row[self.tag]).debugDescription
  • 只是一个建议:永远不要为 UI 或任何其他 SDK 提供的类前缀添加前缀。如果您对自己创建的类有自己的转换,那就更好了。

标签: ios swift sqlite


【解决方案1】:

删除 Martin 建议的不可见字符:

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

【讨论】:

  • 谢谢,解决了。只需编辑您的答案,因为您将相同的 row[self.tag] 与自身进行比较,而应将其与 tagChosen.text! 进行比较:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-07-05
  • 2023-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多