Swift Plist Leyendo e Iniciando Arrays como Objetos para la Clave

Estoy desarrollando una pequeña aplicación basada en UITableView en Swift. Comencé a codificar en profundidad algunas matrices básicas como tales (incluida la statement de class básica y la statement de salida UITableView :

 import UIKit class ScenesViewController: UITableViewController { @IBOutlet var myTableView: UITableView var sceneName = ["Scene 1", "Scene 2", "Scene 3", "Scene 4", "Scene 5"] var sceneDetail = ["Hi", "Hello", "Bye", "My Bad", "Happy"] 

Este código está dentro de un UITableViewController que tiene una salida que está conectada a un UITableView . He creado un plist para esto llamado "Scenes.plist" y he intentado replace el código. En Objective-C, haría esto:

 NSString *path = [[NSBundle mainBundle] pathForResource:@"Scenes" ofType:@"plist"]; NSDictionary *dict = [[NSDictionary alloc] initWithContentsOfFile:path]; sceneName = [dict objectForKey:@"SceneName"]; sceneDetail = [dict objectForKey:@"SceneDetail"]; 

Empecé a hacer esto en Swift así:

 let path = NSBundle.mainBundle().pathForResource("Scenes", ofType:"plist") let dict = NSDictionary(contentsOfFile:path) // Error: 'ScenesViewController.Type' does not have a member named 'path' 

Exploré Internet para encontrar una solución, pero no pude encontrar una. Así que tomé el siguiente curso de acción: un "casi" de una sola línea:

 let dict = NSDictionary(contentsOfFile: NSBundle.mainBundle().pathForResource("Scenes", ofType:"plist")) var sceneName = dict["SceneName"] // Error: 'ScenesViewController.Type' does not have a member named 'dict' 

Ahora, la única solución a la que casi puedo recurrir es tener todo eso en una línea para cada matriz:

 var sceneName = NSDictionary(contentsOfFile: NSBundle.mainBundle().pathForResource("Scenes", ofType:"plist").objectForKey("SceneName") // Warning: Variable 'sceneName' infernetworking to have type 'AnyObject!', which may be unexpected // Fix-It: Add an explicit type annotation to silence this warning (var sceneName: AnyObject! = ...) 

Entonces agregué la anotación de tipo explícito solo para descubrir que había más errores. Dentro de la cellForRowAtIndexPath: function:

 override func tableView(tableView: UITableView?, cellForRowAtIndexPath indexPath: NSIndexPath?) -> UITableViewCell? { let cell: UITableViewCell = tableView!.dequeueReusableCellWithIdentifier("reuseIdentifier", forIndexPath: indexPath) as UITableViewCell // Configure the cell... cell.textLabel.text = sceneName[indexPath!.row] // Error: could not find member 'row' return cell } 

En realidad, hay dos errores ; No sé si esto se duplica accidentalmente o no. Los siguientes errores están en el método prepareForSegue:sender: :

 override func prepareForSegue(segue: UIStoryboardSegue?, sender: AnyObject?) { if segue?.identifier == "ShowDetails" { var detailVC: ScenesDetailViewController = segue!.destinationViewController as ScenesDetailViewController var myIndexPath: NSIndexPath = myTableView.indexPathForSelectedRow() var row: Int = myIndexPath.row detailVC.detailModal = [sceneDetail[row], sceneName[row]] // Error: Could not find an overload for 'subscript' that accepts the supplied arguments } } 

Nuevamente, hay dos errores; Sin embargo, creo que esto se debe a que sceneDetail y sceneName se usan ambos. Parece que hay errores en todo el lugar con la lectura y el uso de plists en files que no están allí (o que no he encontrado) en Objective-C.

Gracias por adelantado,

-KodInc

Para resolver su problema inicial, coloque el código dentro de una function, como:

 var memoryName = [] var memoryDetail = [] override func awakeFromNib() { super.awakeFromNib() let path = NSBundle.mainBundle().pathForResource("Memories", ofType:"plist") let dict = NSDictionary(contentsOfFile:path) memoryName = dict["MemoryName"] as Array<String> memoryDetail = dict["MemoryDetail"] as Array<String> } 

Puede resolver esto moviendo su código en una function que se llama después de la initialization de sus objects.

Las properties se inicializan como parte de la initialization de su object. Ha creado path y dict como properties y está intentando inicializarlas con un código que no cumple con los requisitos de initialization.

Un inicializador no puede llamar a ningún método de instancia, leer los valores de las properties de una instancia, o referirse a sí mismo como un valor hasta después de que se complete la primera fase de initialization.

El lenguaje de progtwigción Swift – Inicialización – Control de security 4

Además, parece que solo desea y necesita sceneName y sceneDetail para ser properties, por lo que puede moverlos completamente dentro del scope del método que utiliza para completar sceneDetail y sceneName después de la initialization.

Es difícil para mí decir cuál es exactamente el error del subíndice porque no veo qué tipo de datos se supone que contenga detailVC.detailModal; aun así, parece que el tipo incorrecto de object se pasa a la matriz detailModal. Una buena descripción de este problema es Swift y matrices