【问题标题】:Swift 2 Array Contains object?Swift 2 数组包含对象?
【发布时间】:2016-05-28 08:47:59
【问题描述】:

为什么这不起作用?我可以在字符串上使用 array.contains() 但它不适用于对象。

var array = ["A", "B", "C"]

array.contains("A") // True

class Dog {
    var age = 1
}

var dogs = [Dog(), Dog(), Dog()]
var sparky = Dog()
dogs.contains(sparky) // Error Cannot convert value of type 'Dog' to expected argument type '@noescape (Dog) throws -> Bool

【问题讨论】:

    标签: arrays swift contains


    【解决方案1】:

    此答案与 OP 的问题无关,但可能对遇到 Swift 错误消息的其他人有所帮助

    不能使用类型为“(whatever)”的参数列表调用“contains”

    但首先是一个小测验:你能发现这里的问题吗?

    internal class FrameworkAdminConnections {
    
       private var _localConnectionKeys = [Int]()
    
       ... other code omitted
    
       public func isLocalConnection(_ connectionKey : Int) {
          return _localConnectionKeys.contains(connectionKey)
       }
    }   
    

    Swift 一直告诉我,我无法使用 (Int) 类型的参数列表调用 contains(),这是一个非常无用的错误消息,我不敢承认我花了多长时间才最终弄清楚.

    真正的问题是 Swift 的推理引擎无法确定 contains() 方法的结果应该是什么 - 因为我愚蠢地没有在 isLocalConnection 上指定“-> Bool” () 方法签名!

    【讨论】:

      【解决方案2】:

      斯威夫特

      如果你不使用对象,那么你可以使用这个代码来包含。

      let elements = [ 10, 20, 30, 40, 50]
      
      if elements.contains(50) {
      
          print("true")
      
      }
      

      如果你在 swift 中使用 NSObject 类。这个变量是根据我的要求。您可以根据自己的要求进行修改。

      var cliectScreenList = [ATModelLeadInfo]()
      var cliectScreenSelectedObject: ATModelLeadInfo!
      

      这是针对同一数据类型的。

      { $0.user_id == cliectScreenSelectedObject.user_id }
      

      如果你想要 AnyObject 类型。

      { "\($0.user_id)" == "\(cliectScreenSelectedObject.user_id)" }
      

      完整状态

      if cliectScreenSelected.contains( { $0.user_id == cliectScreenSelectedObject.user_id } ) == false {
      
      cliectScreenSelected.append(cliectScreenSelectedObject)
      
      print("Object Added")
      
      } else {
      
      print("Object already exists")
      
      }
      

      【讨论】:

        【解决方案3】:

        要真正解释那里发生的事情,首先我们必须了解Array 上有两个contains 方法(或者更好地说,在SequenceType 上)。

        func contains(_ element: Self.Generator.Element) -> Bool
        

        有约束

        Generator.Element : Equatable
        

        和

        func contains(@noescape _ predicate: (Self.Generator.Element) throws -> Bool) rethrows -> Bool
        

        第一个基本上使用== 搜索数组中的给定元素。第二个使用返回 Bool 的闭包来搜索元素。

        第一种方法不能用,因为Dog没有采用Equatable。编译器尝试使用第二种方法,但该方法有一个闭包作为参数,因此您会看到错误。

        解决方案:为Dog 实现Equatable。

        如果你正在寻找对象引用比较,你可以使用一个简单的闭包:

        let result = dogs.contains({ $0 === sparky })
        

        【讨论】:

        • 感谢您的解释。
        • 无法搜索对象引用?
        • @user752543 如果你使用闭包的话。查看我的编辑。
        【解决方案4】:

        您的Dog 需要实现Equatable。

        class Dog: Equatable {
        
           var age = 1
        
        }
        
        func == (lhs: Dog, rhs: Dog) -> Bool {
              return lhs.age == rhs.age
        }
        

        【讨论】:

          猜你喜欢
          • 2018-10-06
          • 2023-04-05
          • 2016-04-24
          • 1970-01-01
          • 1970-01-01
          • 2020-11-15
          • 1970-01-01
          • 1970-01-01
          • 2018-07-03
          相关资源
          最近更新 更多