답변:
주어진 스위프트의 모든 요소를 사용하여 Set
간단히 배열을 만들 수 있습니다.
let array = Array(someSet)
이것은 프로토콜을 Set
준수 하고 시퀀스로 초기화 할 수 있기 때문에 작동 합니다. 예:SequenceType
Array
let mySet = Set(["a", "b", "a"]) // Set<String>
let myArray = Array(mySet) // Array<String>
print(myArray) // [b, a]
NSSet
주어진 경우. 문제는 스위프트에 관한 것이었다 Set
.
가장 간단한 경우 , 스위프트 3, 당신은 사용할 수 Array
의 init(_:)
를 얻기 위해 초기화를 Array
A로부터 Set
. init(_:)
다음과 같은 선언이 있습니다.
init<S>(_ s: S) where S : Sequence, Element == S.Iterator.Element
시퀀스의 요소를 포함하는 배열을 만듭니다.
용법:
let stringSet = Set(arrayLiteral: "car", "boat", "car", "bike", "toy")
let stringArray = Array(stringSet)
print(stringArray)
// may print ["toy", "car", "bike", "boat"]
그러나 , 당신은 또한의 각 요소에 대해 일부 작업을 수행하려는 경우 Set
로 변환이 동안 Array
, 당신이 사용할 수있는 map
, flatMap
, sort
, filter
과에서 제공하는 다른 기능 방법 Collection
프로토콜 :
let stringSet = Set(["car", "boat", "bike", "toy"])
let stringArray = stringSet.sorted()
print(stringArray)
// will print ["bike", "boat", "car", "toy"]
let stringSet = Set(arrayLiteral: "car", "boat", "car", "bike", "toy")
let stringArray = stringSet.filter { $0.characters.first != "b" }
print(stringArray)
// may print ["car", "toy"]
let intSet = Set([1, 3, 5, 2])
let stringArray = intSet.flatMap { String($0) }
print(stringArray)
// may print ["5", "2", "3", "1"]
let intSet = Set([1, 3, 5, 2])
// alternative to `let intArray = Array(intSet)`
let intArray = intSet.map { $0 }
print(intArray)
// may print [5, 2, 3, 1]
추가 :
Swift에는 Set 및 Dictionary에 대한 DEFINED ORDER 가 없습니다. 따라서 sorted () 메서드를 사용하여 배열이 ""a ","b "] 또는 ["b "," "]하고 싶지 않습니다.
이 문제를 해결하려면 :
세트
var example:Set = ["a","b","c"]
let makeExampleArray = [example.sorted()]
makeExampleArray
결과 : [ "a", "b", "c"]
sorted ()없이
그것은 될 수 있습니다:
["a","b","c"] or ["b","c","a",] or ["c","a","b"] or ["a","c","b"] or ["b","a","c"] or ["c","b","a"]
간단한 수학 : 3! = 6
Swift 2.x 이상에 대한 현재 답변 (Swift Programming Language Guide of Collection Types)은 Set 항목을 다음과 같이 반복하는 것 같습니다.
for item in myItemSet {
...
}
또는 "정렬 된"방법을 사용하려면 :
let itemsArray = myItemSet.sorted()
Sets는 실제로 주문되지 않았기 때문에 Swift 디자이너가 allObjects를 액세스 메커니즘으로 좋아하지 않는 것 같습니다. 따라서 명시 적 순서를 적용하지 않고 배열을 벗어나지 않기를 원했습니다.
정렬 오버 헤드를 원하지 않고 순서를 신경 쓰지 않으려면 일반적으로 배열을 추출하는 데 약간 더 빠른 map 또는 flatMap 메소드를 사용하십시오.
let itemsArray = myItemSet.map { $0 }
특정 유형의 배열이 필요한 경우 (예 : 유형이 지정된 집합으로 선언되지 않은 관리 객체 관계 집합의 자격) 다음과 같은 작업을 수행 할 수 있습니다.
var itemsArray : [MyObjectType] = []
if let typedSet = myItemSet as? Set<MyObjectType> {
itemsArray = typedSet.map { $0 }
}
myItemSet.sorted()
요소가이어야합니다 Comparable
. – myItemSet.map { $0 }
와 동일한 결과를 생성해야합니다 Array(myItemSet)
. 둘 다 집합의 모든 요소를 열거하여 배열을 만듭니다. 후자는 여전히 저에게 효과적이며 위의 의견에 대한 자세한 내용은 감사하겠습니다.
이 방법을 호출하고 세트를 전달하십시오
func getArrayFromSet(set:NSSet)-> NSArray {
return set.map ({ String($0) })
}
이것처럼 :
var letters:Set = Set<String>(arrayLiteral: "test","test") // your set
print(self.getArrayFromSet(letters))
let array = Array(someSet)
로 Swift 2