2016-04-07 8 views
1

SWIFT COREDATA Ich habe Probleme beim Einrichten einer For-In-Schleife, um Ergebnisse von einem Abruf zu sammeln. Kein Problem, einzelne Ergebnisse durch Abruf von Ergebnissen [Index] zu erhalten, aber das Einfügen von for-in-Schleife gibt mir einen Fehler (Typ stimmt nicht überein) oder (Typ enthält kein Element in Generator). Ich möchte die Abrufergebnisse verwenden, um ein separates Array zu füllen.SWIFT COREDATA - Durchschleifen von Ergebnissen mit "for in" -Schleifen zum Erstellen eines separaten Arrays

Jede Hilfe, die Sie zur Verfügung stellen können, wird sehr geschätzt.

Auszug aus dem Code:

import Foundation 
import UIKit 
import CoreData 
// globaals 
var pickResult:String? 
var pickMultiresult:[AnyObject]? 
// add var 
var fullnameMulti:[String]? // array of full names 
var i:Int = 0 
// end new var 
class ClientPicker:UIViewController, UIPickerViewDelegate { 
    // connections 

    @IBOutlet weak var singleResult: UITextField! 
    let managedObjectContext = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext 
    @IBOutlet weak var firstname: UITextField! 
    @IBOutlet weak var status: UILabel! 
    var lastname:String = "" 
    var phone:String = "" 
    var email:String = "" 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 
} 
// MARK: ********** block 2 --- findClient **** 
    @IBAction func findClient(sender: AnyObject) { 
     let entityDescription = NSEntityDescription.entityForName("Contacts", inManagedObjectContext: managedObjectContext) 
     let request = NSFetchRequest() 
     request.entity = entityDescription 
     let pred = NSPredicate(format: "(firstname = %@)", firstname.text!) 
     request.predicate = pred 

     do { 
      var results = try managedObjectContext.executeFetchRequest(request) 
      multiresult = results 
      if results.count > 0 { 
//    let match = results[0] as! NSManagedObject NOTE: these return correct data for indices 0 and 3 
//    let match = results[3] as! NSManagedObject NOTE: these return correct data for indices 0 and 3 
       status.text = "There are \(results.count) people named \(firstname.text!)" 
      } else { 
       status.text = "No Match" 
      } 
     } catch let error as NSError { 
      status.text = error.localizedFailureReason 
     } 



// for in loop to populate firstnameMulti array 
     i = 0 
    for i in results{ 
     var p = i 
     let match = results[p] as! NSManagedObject 

       /* the following code returns correct fullname when used outside of for loop 
       but error when I use the for loop */ 
       firstname.text = match.valueForKey("firstname") as? String 
       /***************** concatenate first and last names ********/ 
       let first = match.valueForKey("firstname") as? String 
       let last = match.valueForKey("lastname") as? String 
       // concatenate 
       var fullname:String = "" 
       fullname = "\(first!) \(last!)" 
       singleResult.text = fullname  
     } 
} 

*/ error: value of type string has no member in Generator */ 

Antwort

1

Sie den Text eines Textfeldes in der Schleife ausfüllen und bei jeder Iteration zu überschreiben. Das macht keinen Sinn.

Um ein Array von vollständigen Namen zu generieren, Ihre Objekte holen und werfen auf die richtige NSManagedObject Unterklasse, wie Person so dass Sie ein [Person] Array und dann können Sie einfach map:

let nameList = results.map { "\($0.firstname) \($0.lastname)" } 
1

Mehrere Probleme hier aber ich werde mich auf diejenigen konzentrieren, nach denen du gefragt hast.

Zuerst haben Sie i als Int deklariert und dann versuchen Sie, es in der for in Schleife zu verwenden. Das wird scheitern.

Zweitens sollten Sie Ihre Art Casting als Teil der sein Umgang holen:

var results = try managedObjectContext.executeFetchRequest(request) as! [NSManagedObject] 

Jetzt haben Sie eine Sammlung, die als NSManagedObject eingegeben wird und Ihr for in wird viel sauberer:

for match in results { 
+0

Danke ich änderte diese 2 Aussagen und entfernte überflüssige Variablen, aber jetzt haben Sie einen anderen Fehler. Können Sie mich auf einen Beispielcode zum Erstellen eines Arrays aus einem Abruf hinweisen? – user3784858

+0

Die erste Codezeile, die ich in meiner Antwort gezeigt habe, gibt Ihnen das Array, das Sie brauchen. Welchen Fehler bekommst du? Unbestimmte Kommentare geben keinen Wert und ermöglichen es niemandem, Ihnen zu helfen. –

+0

Wenn Sie mich abstimmen, lassen Sie wenigstens einen Kommentar, warum Sie denken, dass meine Antwort falsch ist. –

Verwandte Themen