2016-05-03 12 views
0

Sagen, ich habe zwei Arrays:Casting-Arrays auf bestimmte Arten in Swift

var exterior: Array<(name: String, value: (code: Code, pass: Bool))> = [] 
var interior: Array<(name: String, value: (code: Code, type: Type, pass: Bool))> = [] 

Ich habe eine UISegmentedControl, die je nach dem Segment ausgewählt wird, werden die Daten aus dem jeweiligen Array zeigen. Zur Reduzierung der vorformulierten, würde Ich mag ein fuction für das Setup verwenden:

func build(section: Section) { 
    var data: Array<Any> 

    switch section { 
    case .Exterior: 
     data = exterior 
    case .Interior: 
     data = interior 
    } 

    for i in 0...data.count - 1 where i % 4 == 0 { 
     for y in i...i + 4 { 
      guard y < data.count - 1 else { 
       break 
      } 
      switch section { 
      case .Exterior: 
       let v = data as! Array<(String, (Report.Code, Bool))> 
       // Do stuff here... 
      case .Interior: 
       let v = data as! Array<(String, (Report.Code, Report.Type, Bool))> 
       // Do stuff here... 
      } 
     } 
    } 
} 

Das wird nicht funktionieren, da ich nicht in ein Array umwandeln kann, die Any hält. Wenn ich den Typ von beiden und exterior zu Any ändere und versuche, sie zu ihren jeweiligen Typen zu verkleiden, erhalte ich einen Fehler: can't unsafeBitCast between types of different sizes. Was sind meine Möglichkeiten in dieser Situation?

+0

Da die Differenz der beiden Array-Typen nur die 'Parameter sind Baumuster zur, wäre es nicht effizienter sein, die Typ-Parameter als optional zu erklären? Der Vorteil ist, dass Sie einen gemeinsamen Typ für beide Arrays haben und "exterior" durch den "nil" -Typ identifizieren können. In Swift mit 'Any' ist immer die schlechteste, schlechteste Angewohnheit, wenn ein spezifischerer Typ (mindestens' AnyObject') verwendet werden kann. – vadian

Antwort

2

Sie können Array<Any> nicht in Array<AnyOther> umwandeln, da zwischen Array<Any> und Array<AnyOther> keine Vererbung vorliegt. Sie sollen tatsächlich solche Anordnungen wie so konvertieren:

let xs: [Any] = [1, 2, 3, 4, 5] 
let ys: [Int] = xs.flatMap { $0 as? Int } 
print(ys.dynamicType) // Array<Int> 
print(ys) // [1, 2, 3, 4, 5] 
Verwandte Themen