2016-03-26 6 views
0

Warum verwende ich Array.contains (AnyObject), um zu prüfen, ob ein Strukturobjekt in diesem Array existiert. Es macht Fehler: „Kann nicht Art von ... throw konvertieren -> Bool“Swift: Array enthält (AnyObject) error Kann den Typ von ... throw nicht konvertieren -> Bool

struct DecorationPatternsData { 
    let patternImageName: String 
    init(patternImageName: String) { 
     self.patternImageName = patternImageName 
    } 
} 
var decorationPatterns : [DecorationPatternsData] = [DecorationPatternsData(patternImageName: "decoration1.gif"), DecorationPatternsData(patternImageName: "decoration1.gif"), DecorationPatternsData(patternImageName: "decoration1.gif")] 

var pickedDecorationPattern : DecorationPatternsData? = nil 

... 

if (pickedDecorationPattern != nil) { 
    if (decorationPatterns.contains(pickedDecorationPattern)) { 
     // Error: Cannot convert type of ... throw -> Bool 
    } 
} 

Antwort

0
... 

if let pickedDecorationPattern = pickedDecorationPattern { 
    if decorationPatterns.contains(pickedDecorationPattern) { 
     // Error: Cannot convert type of ... throw -> Bool 
    } 
} 
2

Das ist, weil Ihr DecorationPatternsData nicht Equatable nicht entspricht, die eine Voraussetzung für die contains(_:) ist zu arbeiten.


Lösung 1:

extension DecorationPatternsData: Equatable { } 

func ==(lhs: DecorationPatternsData, rhs: DecorationPatternsData) -> Bool { 
    return lhs.patternImageName == rhs.patternImageName 
} 

Jetzt DecorationPatternsData zu Equatable entspricht, so können Sie verwenden:

if let pickedDecorationPattern = pickedDecorationPattern { 
    if decorationPatterns.contains(pickedDecorationPattern) { 
    // Your code 
    } 
} 

Lösung 2:

if decorationPatterns.contains({ $0 == pickedDecorationPattern }) { 
    // Your code 
} 

Hier verwenden Sie einen Verschluss, um die Elemente zu vergleichen und geben einen Bool für contains(_:)

zurück