【问题标题】:Cannot find an overload for 'contains' that accepts an argument list of type '(Array<String!>, String)' in Swift在 Swift 中找不到接受类型为“(Array<String!>,String)”的参数列表的“包含”的重载
【发布时间】:2015-09-27 10:34:09
【问题描述】:

我正在尝试使用contains 确定Array 是否包含某个字符串值。数组定义如下:

var myArray: Array<String!> = []

这是在一个单独的文件中(因为它在许多不同的地方被操纵),我正在尝试执行以下操作:

var searchString: String! = "Search"

if contains(myArray, searchString) {
     println("Exists")
}
else {
     println("Doesn't Exist")
}

每次我尝试运行上述代码时,都会收到一条错误消息:

Cannot find an overload for 'contains' that accepts an argument list of type '(Array<String!>, String)'

我尝试了以下方法:

if myArray.contains(searchString) {
...

然后我收到一条错误消息:

'Array<String!>' does not have a member named contains

如何使用contains 而不让 Swift 返回错误?

【问题讨论】:

    标签: arrays swift search contains


    【解决方案1】:

    我认为您的问题与myArray 的类型有关。为什么要使用String!

    这适用于 Swift 1.2

    var myArray: Array<String> = []
    
    var searchString: String = "Search"
    
    if contains(myArray, searchString) {
        println("Exists")
    }
    else {
        println("Doesn't Exist")
    }
    

    这在 Swift 2.0 中(从 Xcode 7 Beta 3 开始)

    var myArray: Array<String> = []
    
    var searchString: String = "Search"
    
    if myArray.contains(searchString) {
        print("Exists")
    }
    else {
        print("Doesn't Exist")
    }
    

    【讨论】:

      【解决方案2】:

      问题在于隐式可选类型Array&lt;String!&gt;。去掉感叹号,代码编译正常。 你真的需要一个可选类型吗?在许多情况下,您可以使用空字符串作为“无字符串”值。

      【讨论】:

        【解决方案3】:

        contains() 函数有两种变体:

        // 1
        func contains<S : SequenceType, L : BooleanType>(seq: S, predicate: @noescape (S.Generator.Element) -> L) -> Bool
        // 2
        func contains<S : SequenceType where S.Generator.Element : Equatable>(seq: S, x: S.Generator.Element) -> Bool
        

        您的代码调用第二个,它要求序列 元素符合Equatable 协议。这是这种情况 String,但不适用于(隐式展开的可选)String!

        String 替换为String! 可以解决问题:

        var myArray: Array<String> = []
        

        如果这不可能,那么您可以使用第一个变体 contains() 使用 谓词 作为第二个参数:

        // Swift 1.2:
        if contains(myArray, { $0 == searchString } ) { ... }
        
        // Swift 2:
        if myArray.contains( { $0 == searchString } ) { ... }
        

        【讨论】:

          【解决方案4】:

          在这种情况下,在 swift 中定义一个字符串数组不应该是通用的,这对你有用

          var myArray: [String] = []
          
          var searchString: String! = "Search"
          
          if contains(myArray, searchString) {
               println("Exists")
          }
          else {
               println("Doesn't Exist")
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-02-19
            • 1970-01-01
            • 2021-12-06
            • 2018-08-16
            • 1970-01-01
            • 2017-01-29
            • 1970-01-01
            • 2017-06-01
            相关资源
            最近更新 更多