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
의 이니셜라이저
가장 간단한 경우, 초기 배열을 다음의 배열에 매핑할 수 있습니다.url
s(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()
의 방법.Set
value는 아무것도 반환하지 않고 기존 집합에 새 요소를 삽입합니다.
이 작업을 수행하려면 다음과 같은 작업을 수행해야 합니다.
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
'programing' 카테고리의 다른 글
Try Catch 블록을 사용해야 하는 경우 (0) | 2023.08.26 |
---|---|
NSUser 기본값으로 배열을 저장하고 읽는 방법을 신속하게 선택할 수 있습니까? (0) | 2023.08.26 |
openpyxl에서 행 값 보기 (0) | 2023.08.26 |
cPanel - MariaDB - 다중 데이터베이스의 업데이트 필드 (0) | 2023.08.26 |
Python에 mariadb 1.1.3 패키지 설치 (0) | 2023.08.26 |