Mit Swift 5.1 können Sie eines der drei folgenden Beispiele verwenden, um Ihr Problem zu lösen.
# 1. Verwenden Array
der map(_:)
Methode und Set
des init(_:)
Initialisierers
Im einfachsten Fall können Sie Ihr ursprüngliches Array einem Array von url
s ( String
) zuordnen und dann aus diesem Array einen Satz erstellen. Der folgende Code für den Spielplatz zeigt, wie es geht:
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)
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)
Als Alternative, können Sie Array
‚s - reduce(_:_:)
Methode:
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. Verwenden einer Array
Erweiterung
Bei Bedarf können Sie eine mapToSet
Methode erstellen Array
, die einen transform
Abschlussparameter verwendet und a zurückgibt Set
. Der folgende Code für den Spielplatz zeigt, wie er verwendet wird:
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)
func reduce<T>(_ initial: T, @noescape combine combine: (T, Self.Generator.Element) throws -> T) rethrows -> T
, was Sie nicht übergeben.