2017-09-06 20 views
0

Swift에서 다른 유형의 배열 두 개를 추가하는보다 우아한 방법이 있습니까?다른 유형의 배열 추가

내 첫 번째 시도는 배열을 Any로 다운 캐스트 한 다음 추가하는 것입니다.

class BasicClass { 
    var name : String = "" 
    var number : Int = -1 

    init(name : String, number : Int){ 
     self.name = name 
     self.number = number 
    } 
} 

let basicClass1 = BasicClass(name: "bc1", number: 1) 
let basicClass2 = BasicClass(name: "bc2", number: 2) 
let basicClass3 = BasicClass(name: "bc3", number: 3) 

let basicClasses : [BasicClass] = [basicClass1, basicClass2, basicClass3] 

for bc in basicClasses{ 
    print(bc.name) 
} 

let strings : [String] = ["one", "two", "three"] 

var anyArray : [Any] = strings as [Any] + basicClasses as [Any] 

이 마지막 줄에 대해 묻습니다.

+0

어떻게 배열의 데이터를 사용할 것인가? 두 배열이 서로 관련이 있습니까? 아니면 그냥 하나의 배열에 결합하고 싶습니까 ?? – OverD

+0

난 그냥 그들을 결합하고 싶습니다. 예를 들어 'if let'을 통해 문자열과 클래스에 액세스 할 수 있습니다. – codddeer123

답변

3

이렇게 [Any]을 만드는 것은 Swift에서 실수입니다. 코코아에 연결하기 때문에 [Any]이 튀어 나오는 장소가 있지만, 결코 그것들을 독립적으로 만들어서는 안됩니다. 믿을 수 없을 정도로 희귀 한 말인데, "절대적으로 무엇이든 배열"이라는 뜻입니다. "절대적으로 무엇이든 괜찮습니다"라는 뜻이 아니라면, Any을 의미하지는 않습니다. (예를 들어, "전혀 아무것도 아님"을 정확하게 받아들이는 print을 고려하십시오.)

"문자열 배열 또는 기본 클래스"가 필요한 경우 그 유형이 있습니다.

enum Element { 
    case basicClass(BasicClass) 
    case string(String) 
} 

let combined = strings.map(Element.string) + basicClasses.map(Element.basicClass) 

이 요소 유형에 문자열과 BasicClasses를 래핑 한 다음 [Element]를 만듭니다 그것은 열거입니다.

나는 그것이이 경우에는 너무 편리하기 때문에 배열을 결합 여기 +을 사용했지만,이 컴파일 시간에 심각한 문제를 만들 수 있으며, 종종. 당신은 일반적으로해야 너무 많은 사본을 강제로 있기 때문에 비효율적

(주 그러나이 예제에서는 .extend을 사용하는 것보다 훨씬 더 예쁘다.)