我一直在咀嚼这一个星期,除非我在Swift中错过了一个非常基本的概念,这似乎是一个非常严重的错误。
我有一个具有一对多关系的CoreData模型,如下所示:
城市 - >有很多街
此外,每个实体都具有string类型的name属性。
相应的类是:
class City: NSManagedObject {
@NSManaged var name: String
@NSManaged var streets: NSOrderedSet
}
class Street: NSManagedObject {
@NSManaged var name: String
}
这里有非常奇怪的东西:
var city:City = getCities().first!
var streets = city.streets.array as! [Street]
var streetToDelete:Street? = nil
//This works
streetToDelete = streets.first
//This is not working !!!
for street in streets {
if(street.name == "champs elysees"){
streetToDelete = street
}
}
deleteStreet(city, street:streetToDelete!)
还有deleteStreet函数:
func deleteStreet(var city:City, var street:Street){
var streets = city.streets
var streetsSet:NSMutableOrderedSet = streets.mutableCopy() as! NSMutableOrderedSet
streetsSet.removeObject(street)
city.streets = streetsSet.copy() as! NSOrderedSet
saveContext()
}
因此,如果我使用streets.first,删除就像接受一样 但是如果我使用foreach循环而没有任何反应 - 没有抛出错误,也没有删除街道。 (当然我需要foreach循环来找到特定的街道并将其删除)。
为什么.first和foreach有什么不同?
他们想在两种情况下都给我一个指向街道的指针。
(getCities()是一本简单的,直接来自书籍,获取操作)
更新: 经过进一步调查后,似乎某些迭代本身对街道数组的影响会导致问题。