为什么要创建静态变量的实例?

时间:2020-07-23 10:48:59

标签: swift static singleton instance

我有一个class,看起来像这样:

class A {
    var aString = ""
    static var staticString = ""
}

如果创建instance中的A,则无法访问static property

var a = A()
a.staticString = "THIS GIVES AN ERROR"

但是,如果我直接创建一个instance staticvariable var a = A.staticString a = "THIS WORKS" 的话,

A.staticString = "hello"

我了解静态变量的方式是,您只能像这样instances直接访问它们。但这似乎并非如此。

(对我而言)更令人困惑的是,我可以创建多个static并使用各自独立的值;那就是值不会保留var a = A.staticString a = "AAA" var b = A.staticString b = "BBB" print(a) //prints AAA print(b) //prints BBB

static

不是b = "BBB"变量应该保持静态?在我的脑海中,a和b都应打印BBB,因为singleton应该覆盖了为其分配的第一个值。

使用class A { static let shared = A() var aString = "" static var staticString = "" } 会使我感到更加困惑,这确实给了我期望的结果:

let instance1 = A.shared
instance1.aString = "A String"
        
let instance2 = A.shared
instance2.aString = "Another String"
        
print(instance1.aString, instance2.aString) //Both print "Another String"
 let numPagina = 2
 jQuery(document).ready(function ($) {
    $.get("/paginacao-ajax/page/"+numPagina+"/",  function(html){ $("#contentAreaAppend").html(html);}); 
 });
 function carregarMaisPaginas(){
    jQuery(document).ready(function ($) {
        $("#contentAreaAppend").html('<div class="carregando"> <div class="loader loader--style2" title="1"> <svg version="1.1" id="loader-1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="40px" height="40px" viewBox="0 0 50 50" style="enable-background:new 0 0 50 50;" xml:space="preserve"> <path fill="#2962ff" d="M25.251,6.461c-10.318,0-18.683,8.365-18.683,18.683h4.068c0-8.071,6.543-14.615,14.615-14.615V6.461z"> <animateTransform attributeType="xml" attributeName="transform" type="rotate" from="0 25 25" to="360 25 25" dur="0.6s" repeatCount="indefinite"/> </path> </svg> </div><p>Carregando</p></div>');
        $('html,body').animate({
            scrollTop: $("#contentAreaAppend").offset().top - 200
        }, 'slow');
        numPagina++;
        $.get("/paginacao-ajax/page/"+numPagina+"/",  function(html){ $("#contentAreaAppend").html(html);});
    });
}

某个善良的灵魂能为我清除一切吗?

1 个答案:

答案 0 :(得分:1)

Swift中的static关键字并不意味着该属性是不可变的/恒定的(与基于C的语言不同)。 static表示该属性是 type属性,而不是 instance属性,表示该属性是该类型本身的属性,在所有实例之间共享,而不是每个实例的属性。有关更多信息,请阅读Swift语言指南的Type Properties部分。

常量/不变属性由let声明,而可变属性由var声明。

您可以使用类型名称(在您的情况下为A)来设置和获取静态变量。

A.staticString = "new"
A.staticString // "new"

如果创建该类型的实例,则可以使用type(of:)来获取元类型(A),该元类型可用于访问静态属性

let a = A()
type(of: a).staticString // "new"
let anotherA = A()
type(of: anotherA).staticString  // "new"