如何在 Swift 中使用区分大小写和不区分大小写的混合字符串避免 Array 中的重复条目?

Posted

技术标签:

【中文标题】如何在 Swift 中使用区分大小写和不区分大小写的混合字符串避免 Array 中的重复条目?【英文标题】:How to avoid duplicate entries in Array with case sensitive and case insensitive mixed Strings in Swift? 【发布时间】:2016-05-03 16:15:46 【问题描述】:

我有一个表格视图,它使用核心数据显示字符串类型的对象列表,用户可以在其中不断向同一个表格添加新对象。但是,有一个限制,即不允许添加重复项。我设法避免了相同的重复,例如:“Bank”/“Bank”。问题是我还需要阻止这样的重复项:“Bank”/“bAnk”或“Bank”/“BAnk”等等,但我不知道该怎么做。

这是我的代码:

 func checkDuplicates(catName: String) -> Bool 
    let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
    let managedContext = appDelegate.managedObjectContext
    var contents = [NSManagedObject]()
    var items = [String]()
    let fetchRequest = NSFetchRequest(entityName: "Categories")
    do 
        let results = try managedContext.executeFetchRequest(fetchRequest)
        contents = results as! [Items]
        for item in contents 
            items.append(item.valueForKey("name") as! String)
        
     catch 
        print("error")
    

    if items.contains(catName) 
        return true
    
    return false

它返回一个布尔值,因此当它返回一个重复项时,我会显示一个警报,告诉用户他可以添加一个重复项。

那么任何人都可以帮助我解决这个问题吗?

【问题讨论】:

【参考方案1】:

无需获取 所有 对象来检查现有的 Core Data 对象。您可以创建一个获取请求 使用 谓词 搜索具有给定名称的对象:

let fetchRequest = NSFetchRequest(entityName: "Categories")
fetchRequest.predicate = NSPredicate(format: "name ==[c] %@", catName)

这里==[c]代表不区分大小写的比较。

事实上,您根本不需要获取对象。你可以 检查与countForFetchRequest()匹配的对象:

var error : NSError? = nil
let count = managedContext.countForFetchRequest(fetchRequest, error: &error)
if count == NSNotFound 
    print("error:", error!.localizedDescription)
    return false
 else if count >= 1 
    return true
 else 
    return false

这更有效,因为执行了获取请求 作为 SQLite 级别的“SELECT COUNT ...”查询,无需获取 对象进入内存。

【讨论】:

【参考方案2】:

您可以将两个字符串都小写以进行比较以避免区分大小写的问题:

let Item_Name = item.valueForKey("name") as! String
items.append(Item_Name.lowercaseString);

if items.contains(catName.lowercaseString) 
    return true

【讨论】:

【参考方案3】:

您可以为contains 方法指定自定义逻辑。看看

let animals = ["Dog", "Cat", "Fish"]
let newAnimal = "dog"
let duplicate = animals.contains  $0.lowercaseString == newAnimal.lowercaseString 
print(duplicate) // true

【讨论】:

以上是关于如何在 Swift 中使用区分大小写和不区分大小写的混合字符串避免 Array 中的重复条目?的主要内容,如果未能解决你的问题,请参考以下文章

Pandas .str.replace 和不区分大小写

如何排序字符串列表而不考虑特殊字符和不区分大小写

Swift 1/2 AutoComplete 字段不区分大小写

JPA - 带有in子句和不区分大小写的规范

SQL Server CE 4 Entity Framework 4.3.1 Code First 不区分重音和不区分大小写的搜索

Swift 4.2 中的 NSSortDescriptor 区分大小写