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 函数?

swift便利构造函数

如何在swift中从.js文件中调用javascript函数

C语言调用Swift方法并传参数

Swift:在使用过滤器函数进行过滤后,调用 indexOf 时无法将类型的值转换为 @noescape