【问题标题】:How to iterate through Array and remove an item based off a string value [duplicate]如何遍历数组并根据字符串值删除项目[重复]
【发布时间】:2016-09-30 05:52:25
【问题描述】:

我有一个带有 is 前缀的字符串。我正在迭代一个字符串数组,如果该值包含前缀,那么我想从Array 中删除该项目。我的代码给了我错误:

致命错误:索引超出范围。

我需要一些关于如何处理此类事情的指导。

for (index, value) in arrayValues.enumerated() {
    if value.contains(prefixValue)  {
        arrayValues.remove(at: index)
     }
}

【问题讨论】:

  • 你的arrayValues是如何定义的?
  • var arrayValues = JSON["array"] as? [String] ,我正在下载这个表单一个 API
  • print(arrayValues) 输出是?
  • [“rehjileo”、“rehjhzse”、“rehjlsid”、“uvhydtkc”、“rehjxeyl”、“dyxejbrq”、“rehjknwz”、“rehjrewz”、“rehjqlam”、“ynabgzuq”、“ rehjpfbv”、“pvuaokhl”、“rehjzhlv”、“rehjwxhj”、“chfmptev”、“ixgabfwj”、“mvhnkusg”、“lvfcipnt”、“rehjlhrn”、“rehjiosy”]
  • var filterArray = arrayValues.filter { !$0.lowercased().contains(prefixValue) } 适用于此解决方案。

标签: ios arrays swift swift3


【解决方案1】:

您是否尝试过为此使用filter

var filterArray = arrayValues.filter { !$0.contains(prefixValue) }

对于不区分大小写的 Swift 3

var filterArray = arrayValues.filter { !$0.lowercased().contains(prefixValue) }

对于不区分大小写的 Swift 2.3 或更低版本

var filterArray = arrayValues.filter { !$0.lowercaseString.contains(prefixValue) }

编辑:我有 filtercontains 的数组,因为 OP 用 contains 提出了问题,但由于某种原因,其他人认为这是错误的答案。所以现在我要添加filterhasPrefix

var filterArray = arrayValues.filter { !$0.lowercased().hasPrefix(prefixValue) }

【讨论】:

  • 欢迎朋友 :)
  • 这将过滤包含reh的字符串。
  • @Mr.UB 我已经根据操作问题给出了答案,这就是我使用包含的原因。
  • @Mr.UB,Nirav D 是对的,问题是“如果值包含前缀”而不是“如果值以前缀开头”。这可能只是糟糕的措辞,但从技术上讲这是正确的答案。 (最好的答案......)
  • @Mr.UB 我想我现在也有明确的答案了,快乐编码:)
【解决方案2】:

为了更明确地说明您正在进行的比较类型,我将使用 hasPrefixrange 方法:

import Foundation

let foo = "test"
let arrayValues = ["Testy", "tester", "Larry", "testing", "untested"]

// hasPrefix is case-sensitive
let filterArray = arrayValues.filter {
  $0.hasPrefix(foo)
}

print(filterArray) // -> "["tester", "testing"]\n"

/* Range can do much more, including case-insensitive.
   The options [.anchored, .caseInsensitive] mean the search will 
   only allow a range that starts at the startIndex and 
   the comparison will be case-insensitive
*/
let filterArray2 = arrayValues.filter {
  // filters the element if foo is not found case-insensitively at the start of the element
  $0.range(of: foo, options: [.anchored, .caseInsensitive]) != nil
}


print(filterArray2) // -> "["Testy", "tester", "testing"]\n"

【讨论】:

  • 这很有意义!谢谢
  • 我在示例中添加了方法hasPrefix,以显示简单的区分大小写的比较。
  • 这应该是正确的答案。除了$0 将是!$0.
  • 没有正确的答案,只有不同的方式来实现你的目标。我同意这个比其他一些解决方案更具表现力,并且具有您不必滚动自己的前缀检测代码的优势。依赖库和框架方法是个好主意,因为它们已经被使用、测试过,并且希望已经解决了错误!
  • 我在我的代码中发现了一个错误,如果被测试的前缀和字符串都有一个共同的前缀,而不是被测试的整个前缀,那么它仍然是正确的。例如,“testeroo”和“testing”都有一个前缀“test”。我更改为range(of:options:range:locale) 以消除此错误。
猜你喜欢
  • 2021-06-19
  • 2011-11-30
  • 2021-12-10
  • 2014-08-05
  • 2012-01-13
  • 1970-01-01
  • 2015-04-10
  • 2020-11-06
  • 1970-01-01
相关资源
最近更新 更多