swift - 函数调用后对象更改
Posted
技术标签:
【中文标题】swift - 函数调用后对象更改【英文标题】:swift - object changes after function call 【发布时间】:2016-05-20 18:06:03 【问题描述】:
我有一个使用以下代码的对象
name = "Toma"
let toma = setupPet(name, family: "Hawn", stage: 1, imageName: "hawn_toma", imageNamef: "", imageNameEgg: "hawn_egg", hatchEXP: 5000, desc: "", eggDesc: "", rarity: "Common")
name = "Hawn"
let hawn = setupPet(name, family: "Hawn", stage: 2, imageName: "hawn", imageNamef: "", imageNameEgg: "hawn_egg", hatchEXP: 5000, desc: "", eggDesc: "", rarity: "Common")
hawn.basePet = toma
let tomaToHawn = NSEntityDescription.insertNewObjectForEntityForName("Evolution", inManagedObjectContext: self.appData.moc) as! Evolution
tomaToHawn.evolveTo = hawn
tomaToHawn.howEvolve = "Level"
tomaToHawn.evolveValue = "10"
NSLog("\(tomaToHawn.evolveTo!.name)")
toma.addEvolveToObject(tomaToHawn)
NSLog("\(tomaToHawn.evolveTo!.name)")
现在两个 NSLog 的结果给出了不同的值,
可选的(“霍恩”)
可选的(“Toma”)
所以它在 addEvolveToObject 调用之后发生了变化 该方法包括
class Pet: NSManagedObject
func addEvolveToObject(value:Evolution)
let items = self.mutableSetValueForKey("evolveTo");
items.addObject(value)
我也尝试过使用@NSManaged func 进行添加进化,但得到了相同的结果。在对象被添加到 nsset 之后,evolveto 被设置为它被添加到的宠物。其他字段保持正确数据
编辑 我已将问题缩小到 addEvolveToObject 方法。如果我在 items.addobject 调用之前使用 NSLog("Pet CD: (value.evolveTo?.name)") 打印它会给出正确的值,但如果我在语句之后打印相同的值,它会给出不同的值
IE:
func addEvolveToObject(value:Evolution)
NSLog("********************************************************************")
let items = self.mutableSetValueForKey("evolveTo");
NSLog("Pet CD: \(value.evolveTo?.name)")
items.addObject(value)
NSLog("Pet CD: \(value.evolveTo?.name)")
NSLog("********************************************************************")
给予
宠物CD:可选(“梅尔”)
宠物CD:可选(“琼”)
如果我注释掉添加对象行,两个 NSLog 都会给出正确的结果
类代码: setup - 只是设置数据库 导入 UIKit 导入核心数据
class Setup: NSObject
let appData : AppData = AppData.sharedInstance
func setup()
// Hawn
name = "Toma"
let toma = setupPet(name, family: "Hawn", stage: 1, imageName: "hawn_toma", imageNamef: "", imageNameEgg: "hawn_egg", hatchEXP: 5000, desc: "", eggDesc: "", rarity: "Common")
name = "Hawn"
let hawn = setupPet(name, family: "Hawn", stage: 2, imageName: "hawn", imageNamef: "", imageNameEgg: "hawn_egg", hatchEXP: 5000, desc: "", eggDesc: "", rarity: "Common")
hawn.basePet = toma
let tomaToHawn = NSEntityDescription.insertNewObjectForEntityForName("Evolution", inManagedObjectContext: self.appData.moc) as! Evolution
tomaToHawn.evolveTo = hawn
tomaToHawn.howEvolve = "Level"
tomaToHawn.evolveValue = "10"
toma.addEvolveToObject(tomaToHawn)
appData.saveContext()
func setupPet(name : String, family : String, stage : NSNumber, imageName : String, imageNamef : String, imageNameEgg : String, hatchEXP : NSNumber, desc : String, eggDesc : String, rarity : String) -> Pet
let pet : Pet = NSEntityDescription.insertNewObjectForEntityForName("Pet",inManagedObjectContext: appData.moc) as! Pet
pet.name = name
pet.family = family
pet.stage = stage
pet.imageName = imageName
pet.imageNamef = imageNamef
pet.imageNameEgg = imageNameEgg
pet.hatchEXP = hatchEXP
pet.rarity = rarity
pet.desc = desc
pet.eggDesc = eggDesc
return pet
宠物——核心数据属性类
import Foundation
import CoreData
extension Pet
@NSManaged var desc: String?
@NSManaged var eggDesc: String?
@NSManaged var family: String?
@NSManaged var gained: NSNumber?
@NSManaged var hatchEXP: NSNumber?
@NSManaged var imageName: String?
@NSManaged var imageNameEgg: String?
@NSManaged var imageNamef: String?
@NSManaged var name: String?
@NSManaged var rarity: String?
@NSManaged var stage: NSNumber?
@NSManaged var adopt: NSSet?
@NSManaged var evolveTo: NSSet?
@NSManaged var userPets: NSSet?
@NSManaged var basePet: Pet?
宠物
import Foundation
import CoreData
class Pet: NSManagedObject
func addEvolveToObject(value:Evolution)
let items = mutableSetValueForKey("evolveTo") as NSMutableSet;
items.addObject(value)
以及进化核心数据类
import Foundation
import CoreData
extension Evolution
@NSManaged var evolveValue: String?
@NSManaged var howEvolve: String?
@NSManaged var evolveTo: Pet?
宠物类可以带多个进化对象,每个进化对象对应一只宠物
【问题讨论】:
不,我正在尝试弄清楚为什么我没有告诉对象会发生变化 我也尝试过使用@NSManaged func 进行添加进化,但得到了相同的结果。在对象被添加到 nsset 之后,evolveto 被设置为它被添加到的宠物。其他字段保持正确数据 你的关系和逆向设置如何? 已添加显示它们的图片 【参考方案1】:原因是双向关系。当您连接关系的一端时,另一端将为您连接,因此当您向集合(多端)添加某些内容时,另一个属性(一端)将为您设置。这就是你所看到的。
如果这不是您想要的,那么您需要再添加 2 个关系,因为您确实希望所有关系都是双向的,但您还希望将当前拥有的 2 个关系分开。
【讨论】:
如何将额外关系的值设置为?# 您不会,它会自动发生,您的代码将保持不变,您只需添加 2 个新关系并将它们连接为新的逆关系(希望这是有道理的) - 所以它不是一个新的关系,它是你现有的两个关系结束的两个新的结束 让我们看看我是否理解。我创建了两个新关系并将它们分配给现有关系的逆关系?每个实体都有一个关系吗? 是的,所以evolveTo
evolutions
,我会在Pet
上更改evolveTo
的名称,因为它不代表多样性,而是类似于@987654325 @ evolution
谢谢,当我可以访问我的 mac 时,我会尝试一下。我实际上已经更改了关系名称,以防万一与它有关,两者都命名相同,我知道这不太可能,但我正在尝试我想到的任何东西以上是关于swift - 函数调用后对象更改的主要内容,如果未能解决你的问题,请参考以下文章
iOS Swift Parse-强制退出应用程序后调用解析云函数
如何从 react native 调用 swift native 函数?