2016-04-07 17 views
1

SWIFT COREDATA フェッチの結果を収集するfor-inループを設定する際に問題があります。 fetch results [index]を使用して個別の結果を取得するのに問題はありませんが、for-inループを挿入するとエラー(型の不一致)または(型にGeneratorのメンバーが含まれません)フェッチ結果を使用して別の配列に値を設定したい。SWIFT COREDATA - "in for"ループで別の配列を作成するループを使用して結果をループする

ご提供いただけるご支援は大変ありがとうございます。コードから

抜粋:

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 */ 

答えて

1

あなたがループ内でテキストフィールドのテキストを充填し、すべての反復でそれを上書きしています。それは意味をなさない。

ので、あなたが[Person]配列を取得して、あなたは、単にmapを使用することができ、そのようなPersonとして、適切なNSManagedObjectのサブクラスにあなたのオブジェクトやキャストをフェッチ、完全な名前の配列を生成するには:

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

ここにいくつかの問題私はあなたが尋ねたものに焦点を当てます。

最初にiIntとして宣言してから、for inループで使用しようとしています。それは失敗するだろう。

第二に、あなたはフェッチの一環として、あなたのタイプキャストを処理する必要があります。

for match in results { 
+0

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

今、あなたはNSManagedObjectとして入力し、あなたのfor inがたくさんクリーナーになっているコレクションを持っていますありがとう、私はこれらの2つのステートメントを変更し、無関係の変数を取り除いたが、別のエラーが発生する。フェッチから配列を作成するコード例を教えてください。 – user3784858

+0

私の答えで示したコードの最初の行で、必要な配列が得られます。あなたはどんなエラーを出していますか?漠然とした意見を述べることは価値がなく、誰でもあなたに助けを与えることはできません。 –

+0

あなたが少なくとも私の答えが間違っていると思う理由をコメントを残して私に投票するつもりなら、 –

関連する問題