2016-11-17 2 views
1

스위프트 배열의 속성을 복제 난 [Place] 100 개체의 배열을 가지고 있고 중복되는 경우에는 GeoPoint 속성에 확인하고 싶습니다 (이것 하나에).확인 내가 3 개 특성을 가진 <code>Place</code>라는 사용자 정의 클래스를 가지고

사용자 지정 개체 배열에서 속성의 중복 된 내용을 어떻게 확인할 수 있습니까?

감사합니다.

+2

가능한 복제 (http://stackoverflow.com/questions/29727618/find-duplicate- [배열 스위프트를 사용하여 중복 요소를 찾기] elements-in-array-using-swift) –

+0

배열을 반복 할 수 있습니다. GeoPoint를 키로 사용하고 GeoPoint를 값으로 사용하여 각 GeoPoint에 대한 사전을 만든 다음 모든 값을 검사하여 제로. – WMios

+0

@WMios 내가 속단하지 않는다. –

답변

1

당신은 같은 것을 할 수 있습니다

var dict : [String : Int] = [:] 

for place in arr { 
    if dict[place.GeoPoint] != nil { // Not in dictionary 
     if dict[place.GeoPoint] >= 1 { // If already there 
      return true // Duplicate 
     } else { 
      dict[place.GeoPoint]! += 1 // Increment instance 
     } 
    } else { 
     dict[place.GeoPoint] = 0 // Put in dictionary 
    } 
} 

return false // No duplicates 

경우 당신은 [Place] 배열을 루프와 같은 GeoPoint을 얼마나 많은 확인하십시오. 그런 다음 한 번 이상이 있는지 확인하십시오. 허용 대답은 좋지만

2

, 나는에 칩 싶습니다.

SDK에서 제공하는 기능에서 둘 다 혜택이 당신이 원하는 것을 달성하기 위해 두 개 더 가지 방법이 있으며,.

1 - 주석에 언급 된 Tj3n으로 Set을 사용하십시오. 이것을 달성하려면 PlaceHashable 프로토콜을 준수해야합니다. hashValue에서

class Place : Hashable { 
    var name = "" 
    var category = "" 
    var geoPoint: CLLocationCoordinate2D = CLLocationCoordinate2D() 

    var hashValue: Int { 
     get { 
      return geoPoint.longitude.hashValue &+ geoPoint.latitude.hashValue 
     } 
    } 
} 

func ==(lhs: Place, rhs: Place) -> Bool { 
    return lhs.geoPoint.latitude == rhs.geoPoint.latitude && lhs.geoPoint.longitude == rhs.geoPoint.longitude 
} 

&+ 운영자는 "추가하고 오버 플로우에 충돌하지 않는다"를 의미한다. 가능한 한 간단합니다. let set = Set(yourArrayOfPlaces) - setgeoPoint 장소와 관련하여 고유 한 정보 만 포함합니다.

2 - KVC를 사용하십시오. 이것이 Objective-C 세계에 더 가깝지만 유용한 도구라고 생각합니다. 이를 달성하려면 PlaceNSObject에서 상속되어야합니다. 그리고 독특한 장소의 배열이 한 줄로 줄일 수있다하기 :

let uniquePlaces = (yourPlacesArray as NSArray).value(forKeyPath: "@distinctUnionOfObjects.geoPoint")