programing

Swift에서 설정할 배열 축소

powerit 2023. 8. 26. 12:26
반응형

Swift에서 설정할 배열 축소

Swift에서 개체 배열을 집합으로 줄이려고 하는데 다음은 내 코드입니다.

objects.reduce(Set<String>()) { $0.insert($1.URL) }

그러나 다음과 같은 오류가 발생합니다.

더 이상의 컨텍스트가 없으면 표현식 유형이 모호합니다.

URL의 종류가 확실히 String이기 때문에 무엇이 문제인지 이해할 수 없습니다.아이디어 있어요?

집합으로 가져오기 위해 배열을 줄일 필요는 없습니다. 배열을 사용하여 집합을 만듭니다.let objectSet = Set(objects.map { $0.URL }).

Swift 5.1에서는 다음 세 가지 예제 중 하나를 사용하여 문제를 해결할 수 있습니다.


#1. 사용하기Array의 방법과Set의 이니셜라이저

가장 간단한 경우, 초기 배열을 다음의 배열에 매핑할 수 있습니다.urls(String그런 다음 해당 배열에서 집합을 만듭니다.아래의 Playground 코드는 이를 수행하는 방법을 보여줍니다.

struct MyObject {
    let url: String
}

let objectArray = [
    MyObject(url: "mozilla.org"),
    MyObject(url: "gnu.org"),
    MyObject(url: "git-scm.com")
]

let urlArray = objectArray.map({ $0.url })
let urlSet = Set(urlArray)
dump(urlSet)
// ▿ 3 members
//   - "git-scm.com"
//   - "mozilla.org"
//   - "gnu.org"

#2. 사용하기Array의 방법

struct MyObject {
    let url: String
}

let objectArray = [
    MyObject(url: "mozilla.org"),
    MyObject(url: "gnu.org"),
    MyObject(url: "git-scm.com")
]

let urlSet = objectArray.reduce(into: Set<String>(), { (urls, object) in
    urls.insert(object.url)
})
dump(urlSet)
// ▿ 3 members
//   - "git-scm.com"
//   - "mozilla.org"
//   - "gnu.org"

대신 다음을 사용할 수 있습니다.Array의 방법:

struct MyObject {
    let url: String
}

let objectArray = [
    MyObject(url: "mozilla.org"),
    MyObject(url: "gnu.org"),
    MyObject(url: "git-scm.com")
]

let urlSet = objectArray.reduce(Set<String>(), { (partialSet, object) in
    var urls = partialSet
    urls.insert(object.url)
    return urls
})
dump(urlSet)
// ▿ 3 members
//   - "git-scm.com"
//   - "mozilla.org"
//   - "gnu.org"

#3. an 사용하기Array연장

필요한 경우 다음을 생성할 수 있습니다.mapToSet을 위한 방법.Array그것은 필요합니다.transform폐쇄 매개 변수 및 반환Set아래의 Playground 코드는 사용 방법을 보여줍니다.

extension Array {

    func mapToSet<T: Hashable>(_ transform: (Element) -> T) -> Set<T> {
        var result = Set<T>()
        for item in self {
            result.insert(transform(item))
        }
        return result
    }

}

struct MyObject {
    let url: String
}

let objectArray = [
    MyObject(url: "mozilla.org"),
    MyObject(url: "gnu.org"),
    MyObject(url: "git-scm.com")
]

let urlSet = objectArray.mapToSet({ $0.url })
dump(urlSet)
// ▿ 3 members
//   - "git-scm.com"
//   - "mozilla.org"
//   - "gnu.org"

reduce()메소드는 결합된 값을 반환하는 폐쇄를 예상하는 반면,insert()의 방법.Setvalue는 아무것도 반환하지 않고 기존 집합에 새 요소를 삽입합니다.

이 작업을 수행하려면 다음과 같은 작업을 수행해야 합니다.

objects.reduce(Set<String>()) {
    $0.union(CollectionOfOne($1.URL))
}

하지만 위의 것은 약간 불필요한 복잡성입니다.대규모 어레이를 사용하는 경우 Swift가 모든 요소를 검토하는 동안 계속해서 증가하는 세트를 생성해야 합니다.objects@NRithH의 조언을 따르고 사용하는 것이 좋습니다.map()그렇게 하면 결과 세트를 한 번에 만들 수 있기 때문입니다.

Swift 1.0-2.x만 해당:

한다면URL당신의 물건에는 강력한 공격력이 있습니다.String새 파일을 생성할 수 있습니다.Set<String>목적과 용도unionInPlace매핑된 배열이 있는 세트에서:

var mySet = Set<String>()
mySet.unionInPlace(objects.map { $0.URL as String })

언급URL : https://stackoverflow.com/questions/34161786/reduce-array-to-set-in-swift

반응형