나는이 확장 기능을 아무런 성공없이 일반화하려고 노력해 왔습니다. 어떤 아이디어를 개선하는 방법? (나는 하드 코드 된 WKBackForwardListItem
및 url
부분을 없애고 모든 속성을 허용하고 싶습니다.) 그러나 이것은 아직 가능하지 않습니다. `Collection` 프로토콜을 Element 속성으로 고유하게 만듭니다.
extension Collection where Iterator.Element: WKBackForwardListItem {
func unique() -> [Iterator.Element] {
var seen: [Iterator.Element] = []
for element in self {
if seen.map({ $0.url }).contains(element.url) == false {
seen.append(element)
}
}
return seen
}
}
이상적으로 서명 배열, WKWebView 역사의 성격을 감안할 때이
func unique(by property: Property) -> [Iterator.Element] {
업데이트
처럼 종료됩니다. 배열의 순서를 유지하는 것은 매우 중요합니다. 따라서 Set
을 사용할 때마다 의문의 여지가 없습니다.
업데이트 2
결과 코드 내가 Collection
프로토콜을 잃었습니다,하지만이 예를 들어 괜찮습니다.
extension Array where Iterator.Element: Equatable, Iterator.Element: Hashable {
func unique() -> [Iterator.Element] {
return NSOrderedSet(array: self).array as! [Iterator.Element]
}
}
고마워요!
속성에 의존하기 때문에'where'를 사용하여 요소 유형을 지정해야합니다. 단순히'Set'에 데이터를 로딩하고'contains'를 사용하는 것이 코드보다 효율적입니다. O (n2) – Paulw11
이 함수는 정확히 무엇을해야할까요? 원하는 출력을 이해할 수 없다고 생각합니다. 구체적으로'seen.map ({$ 0.url}) '은 의미가 없습니다. '보았던'사람들은 어떻게 채워 집니까? 아니면'seen.map'는 매번 빈 배열을 반환하기로되어 있습니까? –
메서드에 대한 인수로 * closure * (컬렉션 요소를 속성에 매핑)를 전달합니다. –