我一直在使用Swift在Core Data中使用to-many关系时遇到一些困难。
我的数据模型
我要做的是使用Country
的实例,然后显示该国家/地区公民的所有Contacts
。正如我一直在尝试这样做,我构建了一个UITableViewController,它将显示该国家的所有公民。但是,我遇到了从关系Contacts
中获取实际citizensOfCountry
的主要问题。这是我正在使用的代码(仅限相关部分)。
class ShowingCitizensOfCountry: UITableViewController {
var countryToShow: Country?
//This is a value that is passed by a prepareForSegue method
override func viewDidLoad() {
//how do I get a list/set/other iterable object of Contacts?
//***Line in question***
let listOfPeople = countryToShow!.citizensOfCountry
for citizen in listOfPeople {
println(citizen)//THIS IS NOT WORKING
}
}
所以,这根本不起作用。现在在for循环中,我得到一个编译器错误,上面写着Type 'Contacts' does not conform to protocol 'Sequence Type'
。我不明白的是它只是类型联系...我会认为这将是某种集合。所以,这不起作用所以我试过了。
let listOfPeople = countryToShow!.citizensOfCountry as! [Contacts]
这也不起作用,我收到错误'NSArray' is not a subtype of 'Contacts'
。接下来我尝试使用NSSet进行转换。
let listOfPeople = countryToShow!.citizensOfCountry as! NSSet<Contacts>
不幸的是,这也不起作用,我收到警告Cast from 'Contacts' to unrelated type 'NSSet' always fails
和Cannot specialize non-generic type 'NSSet'
。接下来我尝试了别的东西。我尝试使用valueForKey
方法。
let listOfPeople = countryToShow!.citizensOfCountry.valueForKey("name") as! Set<String>
这个有效!我只能打印出该国公民的所有人的名字。但是我不明白为什么。为什么当我使用valueForKey("name")
但我无法获得个人联系时,它是否有效?有没有更好的方法来做到这一点,我错过了?我非常感谢您解释为什么我无法从单个Contacts
获取Country
的集合。谢谢。
答案 0 :(得分:7)
抱歉,因为我真的很累,所以无法阅读所有内容。但是从我读过的内容来看,你想要得到一个应该是NSSet的国家的公民。为此,你可以做到:
let contacts = yourArrayOfCountries.flatMap {
$0.citizensOfCountry.allObjects as! [Contacts]
}
根据你的评论:
let contacts = countryToShow!.citizensOfCountry.allObjects as! [Contacts]
答案 1 :(得分:2)
您的错误原因是多对多关系会产生NSSet
。您尝试迭代这些集合的所有尝试都应考虑到这一点。
更好的是实现NSFetchResultsController
,这是在表格视图中显示核心数据的标准方法。
countryToShow
FRC实施:
var fetchedResultsController: NSFetchedResultsController {
if _fetchedResultsController != nil {
return _fetchedResultsController!
}
let fetchRequest = NSFetchRequest(entityName: "Contact")
fetchRequest.sortDescriptors = [NSSortDescriptor(key: "name", ascending: true)]
fetchRequest.predicate = NSPredicate(format:"countryOfOrigin = %@", self.countryToShow!)
let aFetchedResultsController = NSFetchedResultsController(
fetchRequest: fetchRequest, managedObjectContext: self.managedObjectContext!,
sectionNameKeyPath: nil, cacheName: nil)
_fetchedResultsController = aFetchedResultsController
var error: NSError? = nil
if !_fetchedResultsController!.performFetch(&error) {
NSLog("%@", error!)
}
return _fetchedResultsController!
}
var _fetchedResultsController: NSFetchedResultsController? = nil
我将联系人变成了更合适的单数。