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)
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)