2017-02-25 3 views
1

würde ich prüfen möchte, ob ein Element in einem Array existiert:Swift 3: in einem Array für Punkt prüfen

protocol Item { 
     var name: String! {get set} 
     var value: Int! {get set} 
    } 

class UserList { 
    var items: [Item]! 

    func checkItem(item: Item) -> Bool{ 
     if items.contains(where: {$0 === item}) { // Error 
      return true 
     } 
     return false 
    } 
} 

ich diesen Fehler:

Binary operator '===' cannot be applied to two 'Item' operands 

Antwort

1

Wenn Sie wirklich verwenden möchten

protocol Item: class { 
    var name: String! {get set} 
    var value: Int! {get set} 
} 

class UserList { 
    var items: [Item]! 

    func checkItem(item: Item) -> Bool{ 
     return items.contains {$0 === item} 
    } 
} 
: Identitätsoperator ( ===) für Ihre checkItem, können Sie Ihre Item als Klasse-Protokoll erklären 0

(Ich verstehe nicht, warum Sie implizit unverpackte Optionals brauchen, also habe ich sie dort behalten. Aber ich würde mich nie so viele IUOs verwenden)


Aber ich frage mich, ob Identität ist, was Sie wollen.

class ClassItem: Item { 
    var name: String! 
    var value: Int! 

    init(_ name: String, _ value: Int) { 
     self.name = name 
     self.value = value 
    } 
} 
let myList = UserList() 
myList.items = [ClassItem("aaa", 1), ClassItem("bbb", 2)] 
var result = myList.checkItem(item: ClassItem("aaa", 1)) 
print(result) //->false 

Wenn das Ergebnis false ist nicht das, was Sie erwarten, müssen Sie Ihre definieren eigene Gleichheit für die Item und definieren Sie Ihre checkItem(item:) damit.

0

ich immer diese einfache Lösung verwenden, kommt das von objecitve-c

let array = ["a,b"] 
if let _ = array.index(of: "b") 
{ 
    //if "b" is in array   
} 
else 
{ 
    //if "b" is not in aray 
}