2016-10-27 7 views
0

swift 3.0으로 작성된 프로젝트 작업 중입니다. 내 요구 사항은 일부 텍스트 필드에 입력 한 데이터를 저장하고 해당 속성 중 하나를 테이블 뷰에 채우는 것입니다. 일단 행을 선택하면 해당 레코드를 업데이트하려고합니다 (텍스트 필드에 값을 다시 할당).'NSTaggedPointerString'형식의 값을 배열로 변환 할 수 없습니다.

그러나 내가 core data에 저장 한 데이터를 가져 와서 배열에 할당하려고하면 내 코드에 문제가 있습니다. 기본적으로 나는 "작업"이라는 엔티티가 있고 세 가지 속성이 있는데, 코어 데이터에 저장된 속성 ("이름") 중 하나를 채우고 싶기 때문에 테이블보기에 코드를 작성했습니다 다음과 같이. 하지만 내 코드에서 다음 줄에 "Could not cast value of type NSTaggedPointerString (0x10d8f7b90) to NSArray (0x10d8f7c58)"이라는 예외가 발생했습니다.

오류 줄과 코드는 다음과 같습니다.

import UIKit 
import CoreData 

class TableViewController: UIViewController,UITableViewDelegate,UITableViewDataSource { 

@IBOutlet weak var tableView: UITableView! 

let appDelegate : AppDelegate = UIApplication.shared.delegate as! AppDelegate 
let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext 

var tasks = [Task]() 

override func viewDidLoad() { 
    super.viewDidLoad() 

    // Do any additional setup after loading the view. 
} 

override func viewDidAppear(_ animated: Bool) { 

    //var error : NSError? 
    let request = NSFetchRequest <NSFetchRequestResult> (entityName: "Task") 
    request.returnsObjectsAsFaults = false 
    do { 

     let results = try context.fetch(request) 
     // check data existance 
     if results.count>0 { 
      print(results.count) 

      for resultGot in results as! [NSManagedObject]{ 

       if let expName = resultGot.value(forKey:"name"){ 
        print("expence name is :", expName) 
        tasks += expName as! [Task]  
        print("my array is : \(tasks)") 
       } 
      }  
     }  
    }catch{ 
     print("No Data to load") 
    } 
    self.tableView.reloadData() 
} 
override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) 
    cell.textLabel?.text = tasks [indexPath.row] as? String 
    return cell 
} 

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return tasks.count 
} 

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    if segue.identifier == "ShowEditTask"{ 
    let v = segue.destination as! ViewController 
     let indexPath = self.tableView.indexPathForSelectedRow 
     let row = indexPath?.row 


    } 
} 
+0

문제와 관련된 코드 만 게시해야합니다. 그렇지 않으면 독자가 문제를 발견하는 데 시간이 걸립니다. 예를 들어'didReceiveMemoryWarning'과'viewDidLoad'는 문제를 일으키지 않습니다. 그런 다음 가능한 경우 예외를 throw하는 코드 줄을 나타냅니다. 도움을 얻을 수있는 기회가 더 많습니다! –

+1

선생님, 제 설명에 문제가있는 부분을 명확히 표시했습니다. – danutha

+0

'results'는 작업의 배열이고,'resultGot'는 그 배열의 작업이고,'expName'은'name' 키의 값입니다. 핵심 데이터 모델의 유형은 무엇입니까? String? 그렇다면 왜 태스크의 배열에 캐스트하려고합니까? – alexburtnik

답변

0

오류 메시지가 NSTaggedPointerString (expName가) 당신의 목표는이다 NSArray ([Task])

에 주조 될 수 없음을 말한다 : 여기


tasks += expName as! [Task] 
내 전체 코드입니다 name 속성이가 아닌 경우 모두 Task을 작업 배열에 추가하십시오.오류를 일으키는이라는 이름을 추가하려고합니다.

제안 :

fetch(context: 반환 항상 NSManagedObject 서브 클래스의 배열 때문에 즉시 캐스팅.

NSManagedObject 하위 클래스를 사용하고 있으므로 valueForKey 대신 직접 name 속성을 가져옵니다.

배열이 비어있는 경우 루프가 건너 뛰기 때문에> 0 확인이 필요하지 않습니다.

let results = try context.fetch(request) as! [Task] 
    // check data existance 
    print(results.count) 

    for task in results { 
    if let expName = task.name { 
     print("expence name is :", expName) 
     tasks += task  
     print("my array is : \(tasks)") 
    } 
    }  

이하

let results = try context.fetch(request) as! [Task] 
tasks.filter{ $0.name != nil } 

가장 효율적인 방법은 전에 작업에게 적절한 술어를 통해 가져 를 필터링하는 것입니다.

+0

에 코드를 할당하려고합니다. 코드가 라인 작업 + = 작업에서 에러를 발생시키고 있습니다. – danutha

+0

'Task'는'NSManagedObject' 서브 클래스가 아닙니까? – vadian

관련 문제