【问题标题】:2 instances of 1 class don't share their property1 类的 2 个实例不共享它们的属性
【发布时间】:2021-12-28 18:53:45
【问题描述】:

我有 2 个类 (A,B),它们的属性是另一个类 (C) 的实例。 C 类具有一些值的属性(无论是什么类型)。 A类具有从/向C删除和附加对象的方法。B类具有从C类返回对象的方法。现在A类和B类有它们的视图,在A视图上,用户能够从C中附加和删除对象并每次查看更新当 C 发生变化时,视图 B 调用 B 类方法时出现从 C 加载对象,但方法返回 0 个对象。代码示例如下:

class C{
    var property = [Something]
}

class A{
    var c = C()
    func appendOrremove(){
        //... some action
    }
}
class B{
    var c = C()
    func getProperty()->[Something]{
        //... return property of c
    }
}

我可以提供我遇到问题的确切代码,但它会比上面更多的代码。提前致谢!

好吧,我最好显示我的代码

    class FavoriteBeers{
        var favoriteBeers = [Beer]()
    }


    class BeersListInteractor:BeersListInteractorProtocol{
        private var favoriteBeers = FavoriteBeers()
        func addToFavorites(beer: Beer){
            favoriteBeers.favoriteBeers.append(beer)
            saveFavoriteBeers()
        }
        func removeFromFavorites(_ beer: Beer) {
            favoriteBeers.favoriteBeers.removeAll { $0 == beer } 
            saveFavoriteBeers()
        }
    }


class FavoriteBeersInteractor:FavoriteBeersInteractorProtocol{
    private var favoriteBeers = FavoriteBeers()
    func getFavoriteBeers()-> [Beer]{
        return favoriteBeers.favoriteBeers
    }
}

【问题讨论】:

  • 类 A 和 B 有自己的 C 实例,这是故意的还是应该有相同的实例?
  • 听起来你不明白什么是类和实例?如果你想快乐地编写 Swift,这非常重要。
  • @Andrew 我只是希望 A 类所做的更改会影响 B 类方法的返回值
  • 然后您需要将 C 类的相同实例注入 A 和 B。您可以通过构造函数或属性注入来执行此操作(下面 Philip 的回答使用属性注入)。你可以阅读更多关于依赖注入的信息here。或者,您总是可以将 C 设置为 singleton,但这不应该是您轻易做的事情,将对 C 的依赖注入 A 和 B 是一个更好的解决方案。

标签: swift class


【解决方案1】:

您没有展示AB 类的对象是如何相关的,但这对于它们如何共享c 对象很重要。这是一个游乐场示例,如果其他东西控制AB 实例,它将起作用。

class Something{
}
class C{
    var property = [Something()]
}
class A{
    var c: C?
    func appendOrremove(){
    }
}
class B{
    var c: C?
    func getProperty()->[Something]{
        return c?.property ?? []
    }
}

let exC = C()
let exA = A()
exA.c = exC
let exB = B()
exB.c = exC

另一种常见情况是A 对象创建B 对象。在这种情况下,您可能希望类定义如下:

class A{
    var c = C()
    var b: B
    init() {
        b = B(c)
    }
    func appendOrremove(){
    }
}
class B{
    var c: C
    init(_ inC: C) {
        c = inC
    }
    func getProperty()->[Something]{
        return c.property
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多