스위프트를 어레이로 설정


187

NSSet변환 될 수 Array사용 set.allObjects()하지만 새에서 이러한 방법이 없다 Set(SWIFT 1.2 도입이). 스위프트 세트를 NSSet로 변환하고 allObjects()방법을 사용하여 여전히 수행 할 수 있지만 최적은 아닙니다.

답변:


352

주어진 스위프트의 모든 요소를 ​​사용하여 Set간단히 배열을 만들 수 있습니다.

let array = Array(someSet)

이것은 프로토콜을 Set준수 하고 시퀀스로 초기화 할 수 있기 때문에 작동 합니다. 예:SequenceTypeArray

let mySet = Set(["a", "b", "a"])  // Set<String>
let myArray = Array(mySet)        // Array<String>
print(myArray) // [b, a]

4
참고 let array = Array(someSet)로 Swift 2
Suragch

... 또는 myArray = myNSSet.allObjects를 다음과 같이 지정하십시오! [mySpecificType]
angelos.p

3
@plusangel : 예, NSSet주어진 경우. 문제는 스위프트에 관한 것이었다 Set.
Martin R

@ KendallHelmstetterGelner : 위의 코드 예제를 Swift 2.3과 Swift 3으로 다시 확인했습니다. 예상대로 컴파일되고 작동했습니다. 어떤 오류가 발생합니까?
Martin R

@MartinR 흥미롭게도 NSManagedObject 관계의 세트로 시도했지만 당시에는 Array 생성자가 마음에 들지 않았습니다. 이제 문제를 재현하려고 시도 할 수는 없습니다. 그래도 Array 생성자에 "arrayLiteral :"레이블을 추가해야합니다. 이전 의견을 삭제하여 혼동하지 않도록 확인했습니다. 감사합니다. Swift 가이드에이 변환 형식이없는 이유를 모르겠습니다.
Kendall Helmstetter Gelner

21

가장 간단한 경우 , 스위프트 3, 당신은 사용할 수 Arrayinit(_:)를 얻기 위해 초기화를 ArrayA로부터 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]

이 방법 중 하나를 사용하여 선택적 세트에서 선택적 배열을 만들 수 있습니다.
tzaloga 2012 년

11

추가 :

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


10

나는 당신에게 정렬되지 않은를 제공하는 간단한 확장 생성 Array의 속성으로 Set스위프트 4.0 .

extension Set {
    var array: [Element] {
        return Array(self)
    }
}

정렬 된 배열을 원하는 경우 계산 된 속성을 추가하거나 필요에 따라 기존 속성을 수정할 수 있습니다.

이것을 사용하려면 전화하십시오.

let array = set.array

3

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). 둘 다 집합의 모든 요소를 ​​열거하여 배열을 만듭니다. 후자는 여전히 저에게 효과적이며 위의 의견에 대한 자세한 내용은 감사하겠습니다.
Martin R

-2

이 방법을 호출하고 세트를 전달하십시오

func getArrayFromSet(set:NSSet)-> NSArray {

return set.map ({ String($0) })
}

이것처럼 :

var letters:Set = Set<String>(arrayLiteral: "test","test") // your set
print(self.getArrayFromSet(letters))

2
Array (<Set>) 사용이 더 나은 선택입니다
Sébastien REMY
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.