你如何从 Swift 中的 NSManagedObject 获取 NSSet?

How do you fetch NSSet from NSManagedObject in Swift?

对于在我的核心数据中建模的基本抽认卡应用程序,我有从 SetCard 的一对多关系。

每个 Set 都有一个集合名称、集合描述和许多 card1 的关系。每个 Card1 都有正面、背面和照片。在我的 table 视图中,我设法从核心数据中检索所有已保存的 Set 并显示它们。现在我想在用户单击我的下一个视图控制器中的相应单元格时获取每个 Set 的卡片。

这是我的 table 视图控制器代码:

// MARK: Properties
var finalArray = [NSManagedObject]()

override func viewDidLoad() {
    getAllSets()
    println(finalArray.count)
}

func getAllSets() {
    let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
    let managedContext = appDelegate.managedObjectContext!
    let fetchRequest = NSFetchRequest(entityName:"Set")
    var error: NSError?
    let fetchedResults = managedContext.executeFetchRequest(fetchRequest,error: &error) as? [NSManagedObject]
    println("Am in the getCardSets()")
    if let results = fetchedResults {
        finalArray = results
        println(finalArray.count)
    }
    else {
        println("Could not fetch \(error), \(error!.userInfo)")
    }
}

// MARK: Displaying the data

override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
     return 1
}

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

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! SetTableViewCell

    let sets = finalArray[indexPath.row]

    cell.setName.text = sets.valueForKey("setName")as? String
    cell.setDescription.text = sets.valueForKey("setDescription")as? String
    return cell
}

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if segue.identifier == "ShowDetail" {
        let dest = segue.destinationViewController as! Display

        // Get the cell that generated this segue.
        if let selectedCell = sender as? SetTableViewCell {
            let indexPath = tableView.indexPathForCell(selectedCell)!

            let selectedSet = finalArray[indexPath.row]
            dest.recievedSet = selectedSet
        }
    }
}

在我的目标视图控制器中,我将如何检索 recievedSet 中的所有卡片?我尝试将 NSSet 转换为数组并将其转换为 [Card1] 数组,但是当我尝试将第一个 Card1 的前字符串 属性 显示到标签上时,应用程序崩溃,给我错误

CoreData: error: Failed to call designated initializer on NSManagedObject class 'NSManagedObject' 
fatal error: Array index out of range

这是我的详细代码viewController。

@IBOutlet weak var front: UILabel!

var finalArray = [Card1]()
finalArray = retrievedSet.allObjects as![Card1]
front.text = finalArray[0].front

给你的细节控制器一个 属性 类型 CardSet (我使用 "CardSet" 因为 "Set" 是一个 Swift 内置类型名称)。您将所选集传递给此控制器。

您可以使用 属性 进行排序,或者使用 allObjects 生成没有特定顺序的数组。

var cardArray = [Card1]()
var cardSet: CardSet?

viewDidLoad() {
   super.viewDidLoad()
   if let validSet = cardSet {
     cardArray = validSet.cards.allObjects as! [Card1]
   }
}

您的代码无效,因为 finalArray 属于 [CardSet] 类型,因此 finalArray[indexPath.row] 属于 CardSet 类型,无法转换为 NSSet 类型.而 Card1 的关系 正是您正在寻找的 NSSet

最后,我建议给细节控制器一个NSFetchedResultsController,有一个属性来排序,并在获取的结果控制器的谓词中使用传递的CardSet