2015-11-08 18 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協議,在使用'==='之前? –

相關問題