Arrays 如何确保用户不能输入重复项?

Arrays 如何确保用户不能输入重复项?,arrays,swift,duplicates,Arrays,Swift,Duplicates,花了一整天的时间在这个上面。我有一系列的费用填充我的tableview。用户可以从tableview中选择一行来编辑费用,包括名称、金额、到期日期等 我不希望用户能够输入重复的名称。我的意思是,我想对照数组检查它们的输入,以确保名称不存在。这对我来说听起来很简单,但由于某种原因,我无法让它工作 这就是我尝试过的: 代码1: 代码2:与1非常相似 var duplicatesAmount: Int = 0 for expense in Expense.expensesArray.f

花了一整天的时间在这个上面。我有一系列的费用填充我的tableview。用户可以从tableview中选择一行来编辑费用,包括名称、金额、到期日期等

我不希望用户能够输入重复的名称。我的意思是,我想对照数组检查它们的输入,以确保名称不存在。这对我来说听起来很简单,但由于某种原因,我无法让它工作

这就是我尝试过的:

代码1:

代码2:与1非常相似

    var duplicatesAmount: Int = 0
    for expense in Expense.expensesArray.filter({ return $0.ownerName == currentUserName }).filter({ $0.category == expense?.category }) {
        if expense.expenseName.lowercased() == expenseNameTextField.text?.lowercased() {
            duplicatesAmount += 1
            print("POTENTIAL DUPLICATE #\(duplicatesAmount): ",expense.expenseName)
        }
    }
    // if there is more than one expense in the array with the same name, return true
    if duplicatesAmount > 1 {
        return true
    } else {
        return false
    }
编辑:无论是否存在重复项,代码都会运行。即使我故意放了一个进去,它也看不到复制品

更新:这起作用了

if expense?.expenseName == expenseNameTextField.text {
        updateExpenseInfo()
    } else {
        // iterate over the array and see if new name is found anywhere
        let dupArray = Expense.expensesArray.filter({ $0.ownerName == currentUserName && $0.category == expense?.category && $0.expenseName == expenseNameTextField.text })
        if dupArray.isEmpty {
            updateExpenseInfo()
        } else {
            duplicateNameAlert()
        }
    }

您可以这样做:

struct Object {
    let name: String
    let amount: Int

    init(name: String = "", amount: Int = 0) {
        self.name = name
        self.amount = amount
    }
}

let a = Object(name: "Foo", amount: 10)
let b = Object(name: "Bar", amount: 20)

let array = [a, b]

func contains(value: String) -> Bool {
    return array.filter({ $0.name == value }).isEmpty
}

print(contains(value: "Foo")) // true
print(contains(value: "Test")) // false

因此,基本上只需添加contains函数并返回array.filter{$0.name==value}.isEmpty。如果返回true,则保存,否则不保存。您将输入的值传递给它。

您可以这样做:

struct Object {
    let name: String
    let amount: Int

    init(name: String = "", amount: Int = 0) {
        self.name = name
        self.amount = amount
    }
}

let a = Object(name: "Foo", amount: 10)
let b = Object(name: "Bar", amount: 20)

let array = [a, b]

func contains(value: String) -> Bool {
    return array.filter({ $0.name == value }).isEmpty
}

print(contains(value: "Foo")) // true
print(contains(value: "Test")) // false

因此,基本上只需添加contains函数并返回array.filter{$0.name==value}.isEmpty。如果返回true,则保存,否则不保存。您将输入的值传递给它。

发布的代码以什么方式不起作用?对你所面临的问题要清楚明确。好吧,忘了吧。没有错。发布的代码以什么方式不起作用?对你所面临的问题要清楚明确。好吧,忘了吧。没有错。好吧,我试试。问题是它总是会返回true,因为原始数组中有该项。因此,如果我的用户去更改项目的名称,我想检查数组是否有新名称…我真的不明白,你有两个数组吗?为什么不只用一个呢?试着在你的操场上添加并运行我的示例中的代码,你就会看到它是如何工作的。我不认为你需要两个单独的数组来完成你试图在@PhontaineJuddYep上完成的事情,你的建议奏效了。谢谢我只是想得太多太复杂了。我最终使用了稍微不同的代码,但你的建议确实有效。我将公布我最终使用的内容。考虑到当数组放大时(比如1000条记录),过滤对象的效率会降低,您可能需要保留额外的字典来检查项目的存在。使用:字典[名称]!=nil,那么项已经在数据源中了好的,我试试看。问题是它总是返回true,因为原始数组中有该项。因此,如果我的用户去更改项目的名称,我想检查数组是否有新名称…我真的不明白,你有两个数组吗?为什么不只用一个呢?试着在你的操场上添加并运行我的示例中的代码,你就会看到它是如何工作的。我不认为你需要两个单独的数组来完成你试图在@PhontaineJuddYep上完成的事情,你的建议奏效了。谢谢我只是想得太多太复杂了。我最终使用了稍微不同的代码,但你的建议确实有效。我将公布我最终使用的内容。考虑到当数组放大时(比如1000条记录),过滤对象的效率会降低,您可能需要保留额外的字典来检查项目的存在。使用:字典[名称]!=nil,则数据源中已存在项