2015-10-03 8 views

risposta

3

Questo sembra essere un tema oggi :) costruire su un altro grande risposta, vorrei suggerire utilizzando il metodo intersect(_:) su un Set:

let toBeFiltered = ["star0", "star2", "star1", "star0", "star3", "star4"] 
let theFilter = ["star1", "star3"] 
let filtered = Set(toBeFiltered).intersect(theFilter) 

// => ["star1", "star3"] of type Set<String> 

// ...if you actually need an array, you can get one using Array(filtered) 
2

È inoltre possibile filtrare serie Struct così

struct myStruct 
     { 
      var userid:String; 
      var details:String; 
      init() { 
      userid = "default value"; 
      details = "default"; 
      } 

    }; 
    var f1 = myStruct(); 
    f1.userid = "1"; 
    f1.details = "Good boy"; 

    var f2 = myStruct(); 
    f2.userid = "2"; 
    f2.details = "Bad boy"; 

    var f3 = myStruct(); 
    f3.userid = "3"; 
    f3.details = "Gentleman"; 

    var arrNames1:Array = [f1,f3]; 

    var arrNames2:Array = [f3,f1,f2]; 

    let filteredArrayStruct = arrNames1.filter({ (user: myStruct) -> Bool in 
     return arrNames2.contains({ (user1: myStruct) -> Bool in 
     return user.userid == user1.userid; 
     }) 
    }) 
print(filteredArrayStruct) 

Per Set devi conformare il protocollo Hashable

class mytestclass: Hashable 
{ 
    var userid:Int ; 
    var details:String; 

    var hashValue: Int { 
    return self.userid 
    } 
    init(userid: Int, details:String) 
{ 
    self.userid = userid; 
    self.details = details; 
    } 
} 
func ==(lhs: mytestclass, rhs: mytestclass) -> Bool { 
    return lhs.userid == rhs.userid 
} 

var t1 = mytestclass(userid: 1,details: "Good boy"); 


var t2 = mytestclass(userid: 2,details: "bad boy"); 

var t3 = mytestclass(userid: 3,details: "gentle man"); 


var classArrayNames:Set<mytestclass> = [t1,t2]; 

var classArrayNames2:Set<mytestclass> = [t3,t1,t2]; 


let result = Set(classArrayNames).intersect(classArrayNames2) 
Problemi correlati