【问题标题】:Swift: Why can't I use 'contains(: )"?斯威夫特:为什么我不能使用“包含(:)”?
【发布时间】:2016-02-09 02:00:10
【问题描述】:

第 1 步: 我声明了一个协议,命名为ARDevice

protocol ARDevice {
    var deviceName:String{get}
}

第 2 步: 然后我用它来扩展NSNetService

extension NSNetService:ARDevice{
    var deviceName:String{
       get{
           return self.name
       }
    }
}

第 3 步:我创建了一个数组:

var deviceList = [ARDevice]()

第 4 步:我想在回调方法中使用 contains(:),但我不能:

我该怎么做? 我必须实现任何协议吗?

【问题讨论】:

  • 我不确定 Swift 和 Objective-C 数组是否在这里重叠。请改用containsObject:。见the documentation here

标签: swift swift2


【解决方案1】:
 if !deviceList.contains(service) { }

只有在 deviceList 数组的元素——在你的 案例ARDevice - 符合Equatable 协议。特别是, 必须为它们定义 == 运算符。

这里最简单的解决方案是使用“基于谓词”contains() 方法:

if  !deviceList.contains ({ $0.deviceName == service.deviceName }) {
    deviceList.append(service)
}

【讨论】:

  • 非常感谢!但是如果我想知道两个变量是否是同一个对象,我该怎么办? "==" 似乎不能用来反对。
  • @AurumHuang:对于引用(类)类型,“相同运算符”=== 用于检查两个引用是否引用同一个对象。
  • 我试过 "$0 === (service as ARDevice)" ,但是 Xcode 抛出一个错误:"Binary operator '===' cannot be applied to two 'ARDevice'operands"。我有吗在我使用 '===' 之前也实现 Equatable 协议?
  • @AurumHuang:为了将===与ARDevice一起使用,您必须将协议声明为“类协议”,例如stackoverflow.com/questions/32038750/…
猜你喜欢
  • 2016-09-19
  • 2016-05-24
  • 2014-08-09
  • 1970-01-01
  • 1970-01-01
  • 2017-07-22
  • 2017-03-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多