静态布尔值是Swift中的引用类型吗?

Con*_*sed 5 types boolean reference swift

我正在做一些开关.在我的MenuScene类中,有一些布尔值是静态变量,布尔值,用于表示这些开关的状态.

这些是否可以作为引用类型进行寻址,因此我可以确定其他对象能够通过对它们的唯一引用来更改其状态?

梦想,在我梦幻般的伪代码中,我希望改变会iAmOn影响状态myButtonABC_state

class MenuScene {        
        static var myButtonABC_state: Bool = false
        static var myButtonXYZ_state: Bool = false

     override onDidMoveToView {

        let buttonABC = Button(withState: MenuScene.myButtonABC_state)
        let buttonXYZ = Button(withState: MenuScene.myButtonXYZ_state)
       }
    }
Run Code Online (Sandbox Code Playgroud)

在按钮类中

class Button {

var iAmOn: Bool = false

    init(withState state: Bool){
        iAmOn = state
    }

    override onTouchesBegun(... etc...){
        if iAmOn { iAMOn = false }
        else { iAmOn = true} 
    }

}
Run Code Online (Sandbox Code Playgroud)

Flu*_*ity 5

Bool是Swift中的一个结构; 结构是值类型.如果这是不要紧static var,class var,let,var,等,类型是最重要的-所以,不,Bool是值类型.

我认为你不是百分之百地使用所有的术语(主要是因为Apple并没有像往常一样在文档中覆盖它,大声笑).

有"Swift类型"(Bool,Int,您的类/结构等)和"变量/常量类型"(它们将数据保存在存储器寄存器中,例如引用或实际值),以及"存储器寄存器"写/读类型"(变量vs vonstant,mutable vs immutable,varvs let).

不要感到沮丧..这对每个人来说都有点混乱......特别是起初并没有很好的文档.(我试图在早期学习C++指针,这是我的想法).

这是一个很好的参考资料:(在底部) https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/ClassesAndStructures.html

基本上,如果要保留对某些内容的引用,则必须使用引用类型内存寄存器.这意味着使用类实例静态没有区别:

/* Test1: */

struct Hi {
    static var sup = "hey"
}

var z = Hi.sup
Hi.sup = "yo"

print(z) // prints "hey"

/* Test 2: */

class Hi2 {
    static var sup = "hey"
}

var z2 = Hi2.sup
Hi2.sup = "yo"

print(z2) // Prints "hey"
Run Code Online (Sandbox Code Playgroud)

如果你觉得你需要一个指向不属于类的东西的指针,那么你可以使用UnsafeMutablePointerOBJc代码中的类似东西.

或者,您可以将bool包装在类对象(始终是引用)中.

final class RefBool {
   var val: Bool
   init(_ value: Bool) { val = value }
}
Run Code Online (Sandbox Code Playgroud)

以下是使用以下参考类型的一些有趣行为let:

let someBool: RefBool

someBool = RefBool(true)
someBool = RefBool(false) // wont compile.. someBool is a `let`
someBool.val = false      // will compile because of reference type and member is `var`
Run Code Online (Sandbox Code Playgroud)

  • 只是为了澄清,没有`NSUnsafeMutablePointer` Objective-C类型.`UnsafeMutablePointer`是一个纯粹的Swift类型,当C指针桥接到Swift时使用.但它们也可以在纯Swift中使用(`alloc` /`free`等),但是你真的需要一个很好的理由来获得那么低的水平. (2认同)