将数组指针传递给另一个类并保留未来的引用 - Swift

时间:2015-07-19 08:38:18

标签: arrays swift pass-by-reference

我已通过引用成功传递了数组。但是,我想保留引用,以便我可以在另一个类中管理数组。

子类化解析并使用NSManaged,如下所示:

class User: PFUser {
    // MARK: Managed Properties
    @NSManaged private var pets: [Pet]

    // MARK: Properties
    private(set) lazy var petList: PetList = PetList(user: self, pets: &self.pets)

    // non-essentials are omitted
}

PetList类:

class PetList {
    private         var owner: User
    private(set)    var pets: [Pet]

    init(user: User, inout pets: [Pet]) {
        self.owner = user
        self.pets = pets
    }

    func appendPet(pet: Pet) {
        pet.owner = self.owner
        self.pets.append(pet)
    }

}

在init函数中,我试图获取对数组的引用。从那里我想修改PetList类中的数组(例如在appendPet

如何在PetList类中设置变量,使其指向User类中的数组。

2 个答案:

答案 0 :(得分:2)

最简单的方法是制作一个计算属性(如果它应该对所有者的宠物进行操作):

class PetList {
    private         var owner: User
    private(set)    var pets: [Pet] {
        get{ return owner.pets }
        set{ owner.pets = newValue }
    }

    init(user: User) {
        self.owner = user
    }

    func appendPet(pet: Pet) {
        pet.owner = self.owner
        self.pets.append(pet)
    }

}

但是对于许多宠物来说这可能会很慢,因为每次改变阵列都会设置所有者的宠物。

另一种方法是将数组包装在一个类中:

class ArrayWrapper<T> {
    var array: [T]
    init(_ array: [T]) {
        self.array = array
    }
}

然后只使用包装器而不是数组:

class User: PFUser {
    // MARK: Managed Properties
    @NSManaged private var pets: ArrayWrapper<Pet>

    // MARK: Properties
    private(set) lazy var petList: PetList = PetList(user: self, pets: self.pets)

    // non-essentials are omitted
}

class PetList {
    private         var owner: User
    private(set)    var pets: ArrayWrapper<Pet>

    init(user: User, pets: ArrayWrapper<Pet>) {
        self.owner = user
        self.pets = pets
    }

    func appendPet(pet: Pet) {
        pet.owner = self.owner
        // operate only though the wrapper with .array
        self.pets.array.append(pet)
    }

}

旁注:您可能应该使用变量owner weakunowned来避免参考周期。

答案 1 :(得分:0)

在swift中解决问题的适当方法是在课程中使用extension将所有Pet相关函数添加到User类。