我在使用 Swift 的 Core Data 中使用多对多关系时遇到了一些困难。
我的数据模型
我想要做的是使用 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'
。我不明白的是,它只是 Contact 类型...我认为这将是某种集合。所以,这不起作用,所以我尝试了这个。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
集合的任何解释。谢谢。 最佳答案
对不起,因为我真的很累,我无法阅读所有内容。但是从我读过的书中,您想得到一个应该是NSSet的国家的公民。要做到这一点,您只需执行以下操作:
let contacts = yourArrayOfCountries.flatMap {
$0.citizensOfCountry.allObjects as! [Contacts]
}
根据您的评论:
let contacts = countryToShow!.citizensOfCountry.allObjects as! [Contacts]