2016-08-03 17 views
0

erstellt wird. Also basierend auf dem folgenden Tutorial expandableCells funktioniert die Verwendung von Sub-Scripting mit NSMutableArray. (Ich öffnete das Projekt selbst in xcode und bekomme keine Fehler)Wollte sehen, ob irgendjemand irgendeinen Einblick hat, warum ein "ambigreicher Gebrauch von tiefgestelltem" Fehler in einem Projekt vs. einem anderen in swift

Wenn ich versuche, diesen Workflow in meinem eigenen Projekt zu verwenden, bekomme ich "mehrdeutige Verwendung von tiefgestellten" Fehlern überall. Dies ist das gleiche Problem in einer früheren Frage Ambiguous use of subscript

Meine Frage wäre warum würde das Projekt von appcoda in xcode arbeiten, aber ähnlicher Code nicht funktionieren, wenn Sie versuchen, einen ähnlichen Workflow in einem neuen Projekt zu verwenden. Nun, das Problem scheint zu sein, wie schnell NSMutableArray gehandhabt wird, denn wenn ich den Code als ein schnelles Array und ein Wörterbuch schreibe, funktioniert alles, außer es gibt keine einfache Möglichkeit, das plist in ein schnelles Array zu konvertieren.

ist mein plist im gleichen Format wie das Tutorial: Array, Array, Wörterbuch

hier ein Snip ist, wo ich den Fehler sehe

var cellDescriptors: NSMutableArray! 

func loadSections() { 

    let path: String = NSBundle.mainBundle().pathForResource("NewCells", ofType: "plist")! 
    cellDescriptors = NSMutableArray(contentsOfFile: path) 
    getIndicesOfVisibleRows() 
    tblExpandable.reloadData() 
} 

func getIndicesOfVisibleRows() { 
    visibleRowsPerSection.removeAll() 

    for currentSectionCells in cellDescriptors { 
     var visibleRows = [Int]() 

     for row in 0...((currentSectionCells).count - 1) { 
**ERROR HERE==>** if currentSectionCells[row]["isVisible"] as! Bool == true { 
       visibleRows.append(row) 
      } 
     } 

     visibleRowsPerSection.append(visibleRows) 

     print("visibleRows \(self.visibleRowsPerSection)") 
    } 
} 
+0

Versuchen Laden sie und Gießen als [ANYOBJECT]. 'var cellDescriptors: [AnyObject] = []' 'zelleDescriptoren = NSArray (contentsOfURL: url) as? [AnyObject] ?? [] ' –

+0

Es hängt von vielen Dingen ab, ob die Anwendung von Subscript auf' AnyObject' "Mehrdeutige Verwendung von Subscript" verursacht oder nicht. Listen Sie alle Importe in Ihrem Projekt auf und sehen Sie, welche davon sich auswirken. – OOPer

+0

@leo, das hat nicht funktioniert. Das hat einen unangenehmen Segmentierungsfehler ausgelöst. Bei OOPer ist mein einziger Import UIKit. Vielen Dank für Ihre Antworten. – Chris

Antwort

0

Wie in der Antwort, die Sie verknüpft erklärt , Foundation-Container (NSArray, NSDictionary usw.) sind nicht typisiert. So gibt currentSelectionCells[row]AnyObject zurück. Swift lässt Sie keine AnyObject tiefstellen, da es kein Container sein kann. Es könnte buchstäblich alles sein.

Wenn Sie genau auf den Code in dem Artikel AppCoda schauen, wo Sie haben

for row in 0...((currentSectionCells).count - 1) { 

sie haben

for row in 0...((currentSectionCells as! [[String: AnyObject]]).count - 1) { 

Sie currentSelectCells zu einem Swift Array überbrückt haben ein Swift-Wörterbuch von String:AnyObject so enthält, wenn sie sagen später currentSelectionCells[row] sie erhalten ein Wörterbuch [String:AnyObject] zurück. Diese ist subscriptable und Swift ist glücklich.

So, ist eine einfache Möglichkeit, ein PLIST zu einem Swift-Array zu konvertieren. Im Allgemeinen ist es am besten, Foundation-Container zum frühestmöglichen Zeitpunkt in Swift-Container zu konvertieren, da Sie dann die Vorteile der Elementtypisierung erhalten. Es wäre besser gewesen, wenn sie loadCellDescriptors als so etwas wie umgesetzt hatte:

var cellDescriptors: [[String:AnyObject]]! 

func loadCellDescriptors() { 
    if let path = NSBundle.mainBundle().pathForResource("CellDescriptor", ofType: "plist") { 
     let plist = NSMutableArray(contentsOfFile: path) 
     cellDescriptors = plist as! [[String:AnyObject]] 
     getIndicesOfVisibleRows() 
     tblExpandable.reloadData() 
    } 
} 
+0

Vielen Dank für die gründliche Antwort. Ich habe versucht, den letzten Teil funktionierte, aber ich musste NSMutableArray zu NSArray zuerst werfen, bevor ich es zu einem schnellen Array werfen konnte.Als ein weiteres Experiment habe ich auch versucht, die 2 Klassen aus der Appcoda-Datei in neue Dateien in meinem Projekt zu kopieren, da ich dachte, dass das so funktionieren würde, wie es ist, und die gleichen mehrdeutigen Fehler auftauchten. für alle Antworten. Ich werde dies als die richtige Antwort markieren. – Chris