스위프트 배열의 속성을 복제 난 [Place]
100 개체의 배열을 가지고 있고 중복되는 경우에는 GeoPoint
속성에 확인하고 싶습니다 (이것 하나에).확인 내가 3 개 특성을 가진 <code>Place</code>라는 사용자 정의 클래스를 가지고
사용자 지정 개체 배열에서 속성의 중복 된 내용을 어떻게 확인할 수 있습니까?
감사합니다.
스위프트 배열의 속성을 복제 난 [Place]
100 개체의 배열을 가지고 있고 중복되는 경우에는 GeoPoint
속성에 확인하고 싶습니다 (이것 하나에).확인 내가 3 개 특성을 가진 <code>Place</code>라는 사용자 정의 클래스를 가지고
사용자 지정 개체 배열에서 속성의 중복 된 내용을 어떻게 확인할 수 있습니까?
감사합니다.
당신은 같은 것을 할 수 있습니다
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
을 얼마나 많은 확인하십시오. 그런 다음 한 번 이상이 있는지 확인하십시오. 허용 대답은 좋지만
, 나는에 칩 싶습니다.
SDK에서 제공하는 기능에서 둘 다 혜택이 당신이 원하는 것을 달성하기 위해 두 개 더 가지 방법이 있으며,.
1 - 주석에 언급 된 Tj3n으로 Set
을 사용하십시오. 이것을 달성하려면 Place
을 Hashable
프로토콜을 준수해야합니다. 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)
- set
은 geoPoint
장소와 관련하여 고유 한 정보 만 포함합니다.
2 - KVC를 사용하십시오. 이것이 Objective-C 세계에 더 가깝지만 유용한 도구라고 생각합니다. 이를 달성하려면 Place
이 NSObject
에서 상속되어야합니다. 그리고 독특한 장소의 배열이 한 줄로 줄일 수있다하기 :
let uniquePlaces = (yourPlacesArray as NSArray).value(forKeyPath: "@distinctUnionOfObjects.geoPoint")
의
가능한 복제 (http://stackoverflow.com/questions/29727618/find-duplicate- [배열 스위프트를 사용하여 중복 요소를 찾기] elements-in-array-using-swift) –
배열을 반복 할 수 있습니다. GeoPoint를 키로 사용하고 GeoPoint를 값으로 사용하여 각 GeoPoint에 대한 사전을 만든 다음 모든 값을 검사하여 제로. – WMios
@WMios 내가 속단하지 않는다. –