Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 从类方法中查找类的实例_Swift - Fatal编程技术网

Swift 从类方法中查找类的实例

Swift 从类方法中查找类的实例,swift,Swift,我试图创建一个类方法,该方法可以选择性地返回该类的一个(已经实例化的)实例 我在考虑将实例化类的内存地址写入用户默认键,然后尝试返回该地址处的对象,但我不确定这是否是一种正确的方法或如何实现 class MyClass { let myProperty: String required init(myProperty: String) { self.myProperty = myProperty } class func currentCla

我试图创建一个类方法,该方法可以选择性地返回该类的一个(已经实例化的)实例

我在考虑将实例化类的内存地址写入用户默认键,然后尝试返回该地址处的对象,但我不确定这是否是一种正确的方法或如何实现

class MyClass {

    let myProperty: String

    required init(myProperty: String) {
        self.myProperty = myProperty
    }

    class func currentClass() -> MyClass? {
        return nil
    }
}

let aNewClass = MyClass(myProperty: "Hi")

// Should return the aNewClass instance:
MyClass.currentClass()

您需要创建一个静态属性,将已创建的成员分配给该属性:

class MyClass {
    let myProperty: String
    private static var instance : MyClass?

    required init(myProperty: String) {

        self.myProperty = myProperty

        if MyClass.instance == nil {
            MyClass.instance = self
        }
    }

    class func currentClass() -> MyClass? {
        return MyClass.instance
    }
}

let aNewClass = MyClass(myProperty: "Hi")

这有点类似于单例模式,您总是可以从类中检索相同的对象。您也可以删除赋值周围的
if
,使类始终返回最新实例(如果这更适合您的需要)。

对我来说,这听起来像是一个单例类,由于垃圾收集在swift中的工作方式(即引用计数),它被高度忽略。singleton类会产生一个永远不会被释放的引用循环。。这里有一些提示:@FlorianWeßling我大体上同意单身人士的看法,但值得一提的是,单身人士通常不会被释放。@Caleb是的,当然。如果需要的话,我的第二个链接可能会有所帮助:@FlorianWeßling虽然这段代码举例说明的类几乎是一个单体,但它不是完全的,我相信我通过清除下面luk2302的答案中的静态属性来避免引用循环,方法是声明它为弱,然后在deinit中将它设置为零。@TheRedElement啊,好主意!但是我没有看到
弱的
关键字。我错过了什么吗?泰,这很好而且工作得很好,你知道声明静态属性弱有什么含义吗?@freedelement使其弱只会导致它在应用程序运行期间,当没有其他对象对它有任何引用时,它可能是
nil
。如果你能解决这个问题,甚至想要解决这个问题,那就继续吧。实际上,在de init上,我可以清除静态属性,这似乎避免了引用循环。@在这里,redElement引用循环不是正确的术语,因为没有实循环,你只需永远保持引用,因为静态变量永远存在。你到底担心什么?@thefreedelement是的,这是真的,但这是个问题吗?内存中始终有一个实例。当应用程序终止时,它将被清除。这不是一个问题,完全可以接受。