2014-12-20 91 views
1

我有以下結構:檢查是否結構是在陣列

struct MyStrict { 
    let prop1: String 
    let prop2: [String: NSData] 
    let prop3: [String] 

    init (prop11: String, prop22: [String : NSData], prop33: [String]) { 
     prop1 = prop11 
     prop2 = prop22 
     prop3 = prop33 
    } 
} 

實例結構被放置在陣列。我需要做的是找出具有這些屬性的結構是否在陣列中。我需要比較數據。

事情是這樣的:

var arr = [MyStrict]() 

var str1 = MyStrict(prop11: "test1", prop22: ["aa": NSData()], prop33: ["bb"]) 
arr.append(str1) 

var str2 = MyStrict(prop11: "test2", prop22: ["bb": NSData()], prop33: ["cc"]) 
arr.append(str2) 

var str3 = MyStrict(prop11: "test3", prop22: ["cc": NSData()], prop33: ["dd"]) 
arr.append(str3) 

var str4 = MyStrict(prop11: "test1", prop22: ["aa": NSData()], prop33: ["bb"]) // has the same data as str1 
arr.append(str4) 

正如你可以看到str1str4具有相同的數據。所以str4不應該添加到數組中。

我的問題什麼是正確的方法來做到這一點?

回答

2

您需要的協議Equatable添加到您的結構

struct MyStrict: Equatable { 
... 
} 

然後,你必須添加的==操作符類下是這樣的:

func == (lhs: MyStrict, rhs: MyStrict) -> Bool { 
    if lhs.prop1 == rhs.prop1 && lhs.prop3 == rhs.prop3 && lhs.prop2 == rhs.prop2 { 
    return true 
} 

    return false 
} 

現在,要知道,如果你的結構已經在陣列中,你只需要使用它:

if contains(arr, str4) == true { 
    println("already in") 
} else { 
    println("Not in") 
} 
+1

或者只是'if contains(arr,str4)...' –

+1

I編輯答案。包含更符合問題需求。 –