关于Swift中的单例模式

关于Swift中的单例模式,swift,singleton,Swift,Singleton,以下是Swift中的一个简单单例模式,它来自: 下面是一个测试函数: func testFunc() { var s1 = Test.shareTest var s2 = Test.shareTest var s3 = Test.shareTest var s4 = Test.shareTest func printPointer(pointer: UnsafePointer<Test>) {

以下是Swift中的一个简单单例模式,它来自:

下面是一个测试函数:

func testFunc() {

        var s1 = Test.shareTest
        var s2 = Test.shareTest
        var s3 = Test.shareTest
        var s4 = Test.shareTest

        func printPointer(pointer: UnsafePointer<Test>) {
            println(pointer)
        }

        printPointer(&s1)
        printPointer(&s2)
        printPointer(&s4)
        printPointer(&s3)

        println(s1.a)
        println(s2.a)
        println(s3.a)
        println(s4.a)

        s1.a = 4444

        println("s2.a = \(s2.a)")
        println("s3.a = \(s3.a)")
        println("s4.a = \(s4.a)")

    }
它看起来像一个单例模式,因为只分配s1.a的值,而不是s2.a,s3.a,s4。一个值也发生了变化,但是,如果它是一个真正的单例模式,为什么&s1,&s2,&s3,&s4完全不同呢

0x00007fff54432ad8
0x00007fff54432ad0
0x00007fff54432ac0
0x00007fff54432ac8

Swift 1.2之前的单件感谢Will M.的澄清

class ActivityIndicator {

    class var sharedInstance: ActivityIndicator {
        struct Singleton {
            static let instance = ActivityIndicator()
        }
        return Singleton.instance
    }
}

好的,您没有打印s1、s2、s3、s4的值。您正在使用&运算符打印s1、s2、s3和s4的内存位置


请记住,这些内存位置包含相同的实例……因此,您很熟悉您的单例模式

每个变量,s1、s2、s3、s4都有一个指向测试对象的指针。打印&s1打印该指针的位置,而不是指向的对象的位置。如果要打印对象引用指向的对象的地址

println(unsafeAddressOf(s1))
println(unsafeAddressOf(s2))
等等


(为了更好地理解这一点,我提出了一个问题)

实际上,您并不是在打印s1、s2、s3、s4的值。您是在打印s1、s2、s3和s4的内存位置,使用符号(&S)…记住这些内存包含相同的值instance@anishparajuli,如果你想得到正确答案的奖励,你应该把它作为一个答案而不是评论,然后OP应该接受它。好的..谢谢我这么做:)谢谢你的答案,我试过了,它有效,但是:),它有同样的问题,结果是&s1,&s2,&s3,&s4,不同:0x00007fff5f8dcad8 0x00007fff5f8dcad0 0x00007fff5f8dcac0 0x00007fff5f8dcac0 0x00007fff5f8dcac8 1 1 1 1 1 1 s2.a=444444 s3.a=4444 s4.a=4444您不需要在Swift 1.2及更高版本中实现。这是您要求的吗。。。去检查你的问题??这太疯狂了@ABLUE:(对不起…这是我的第一个问题,我的描述不够清楚,下次我会改进,再次对不起@copeME@copeME我的回答和其他答案一样,但更清楚,我为OP提供了一种方法,让他做他想让他的程序做的事情,这也是一种方法,表明变量进行了相同的测试,而不是仅仅说这是wh事情就是这样发生的。@ABLUE公正地说……这就是我们的工作方式,所以……无论如何,试着去学习then@WillM.你发布了答案,但后来他对答案感到困惑…不是他问的问题…没关系!!!
class ActivityIndicator {

    class var sharedInstance: ActivityIndicator {
        struct Singleton {
            static let instance = ActivityIndicator()
        }
        return Singleton.instance
    }
}
println(unsafeAddressOf(s1))
println(unsafeAddressOf(s2))