2015-11-08 15 views
1

步骤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(:),但是我不能: enter image description here

我该怎么做? 我必须执行任何协议吗?

+0

我不知道,如果斯威夫特和Objective-C数组重叠在这里。改为尝试'containsObject:'。见[这里的文档](https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSArray_Class/index.html#//apple_ref/occ/instm/NSArray/containsObject :) – Arc676

回答

2
if !deviceList.contains(service) { } 

只有在deviceList阵列的元件可以使用 - 在 情况ARDevice - 符合Equatable协议。特别是, a ==运算符必须为它们定义。

这里最简单的方法是使用“基于谓词” 方法:

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

非常感谢!但是如果我想知道两个变量是否是同一个对象,我该怎么办? “==”似乎不能用来反对。 –

+0

@AurumHuang:对于引用(类)类型,“相同运算符”===用于检查两个引用是否引用同一个对象。 –

+0

我试过“$ 0 ===(service as ARDevice)”,但Xcode抛出一个错误:“Binary operator'==='不能应用于两个'ARDevice'操作数”。我是否也必须实现Equatable协议,在使用'==='之前? –

相关问题