如何在 Swift 中使用区分大小写和不区分大小写的混合字符串避免 Array 中的重复条目?
How to avoid duplicate entries in Array with case sensitive and case insensitive mixed Strings in Swift?
我有一个 table 视图,它使用 Core Data 显示字符串类型的对象列表,用户可以在其中向同一个 table 添加新对象。但是,有一个限制,即不允许添加重复项。我设法避免了相同的重复,例如:"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
}
它 returns 一个布尔值,所以当它 returns 一个重复项时,我会显示一个警报,告诉用户他可以添加一个重复项。
所以有人可以帮助我吗?
您可以将两个字符串小写进行比较以避免区分大小写的问题:
let Item_Name = item.valueForKey("name") as! String
items.append(Item_Name.lowercaseString);
和
if items.contains(catName.lowercaseString) {
return true
}
您可以为 contains
方法指定自定义逻辑。看
let animals = ["Dog", "Cat", "Fish"]
let newAnimal = "dog"
let duplicate = animals.contains { [=10=].lowercaseString == newAnimal.lowercaseString }
print(duplicate) // true
无需获取 所有 对象即可检查现有的 Core Data 对象。您可以创建一个获取请求
使用 predicate 搜索具有给定名称的对象:
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 ..." 查询,无需获取
将对象存入内存。
我有一个 table 视图,它使用 Core Data 显示字符串类型的对象列表,用户可以在其中向同一个 table 添加新对象。但是,有一个限制,即不允许添加重复项。我设法避免了相同的重复,例如:"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
}
它 returns 一个布尔值,所以当它 returns 一个重复项时,我会显示一个警报,告诉用户他可以添加一个重复项。
所以有人可以帮助我吗?
您可以将两个字符串小写进行比较以避免区分大小写的问题:
let Item_Name = item.valueForKey("name") as! String
items.append(Item_Name.lowercaseString);
和
if items.contains(catName.lowercaseString) {
return true
}
您可以为 contains
方法指定自定义逻辑。看
let animals = ["Dog", "Cat", "Fish"]
let newAnimal = "dog"
let duplicate = animals.contains { [=10=].lowercaseString == newAnimal.lowercaseString }
print(duplicate) // true
无需获取 所有 对象即可检查现有的 Core Data 对象。您可以创建一个获取请求 使用 predicate 搜索具有给定名称的对象:
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 ..." 查询,无需获取 将对象存入内存。