2016-11-20 3 views
5

Я делаю некоторые переключатели. В моем классе MenuScene есть несколько логических переменных, которые являются статическими переменными, booleans, для представления состояний этих переключателей.Является статическим булевым ссылочным типом в Swift?

Являются ли эти адресабельными ссылочными типами, поэтому я могу быть уверен, что другие объекты могут изменить свое состояние с уникальной ссылкой на них?

сон, в моем мечтательного псевдокода, я надеюсь, что изменения в 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) 
     } 
    } 

В классе кнопки

class Button { 

var iAmOn: Bool = false 

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

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

} 
+0

Вы должны обновить свой вопрос с некоторыми соответствующим кодом. Проводили ли вы какие-либо тесты, чтобы узнать, какие результаты вы получите? – rmaddy

+0

@rmaddy Я думаю, что он/она не совсем уверен в терминологии в том, что спрашивает :) Confused, см. Мой ответ для некоторой ясности (надеюсь!) – Fluidity

+0

Нет, @maddy, не проводил никаких тестов. обновили вопрос, чтобы показать, что я надеюсь. Не знаю, как это сделать. – Confused

ответ

5

Bool является структурой в Swift; structs - типы значений. Не имеет значения, является ли это static var, class var, let, var и т. Д., Тип имеет значение, поэтому нет, Bool - тип значения.

Я думаю, что вы не на 100% относитесь ко всей терминологии (в основном потому, что Apple действительно не покрывает ее в документации, как обычно, LOL).

Есть «Swift Types» (Bool, Int, ваши классы/структуры и т. Д.) И «Variable/Constant Types» (которые хранят данные в регистре памяти, такие как ссылки или фактические значения), а также как «Типы записи/чтения регистра памяти» (переменная vs vonstant, mutable vs immutable, var vs let).

Не расстраивайтесь .. Это немного запутанно для всех ... Особенно вначале и без хорошей документации. (Я пробовал изучать указатели C++ раннего возраста, и это было на моей голове).

Вот хороший справочный материал: (к низу) https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/ClassesAndStructures.html

В принципе, если вы хотите, чтобы содержать ссылку на что-то, вы должны использовать регистр Reference Тип памяти. Это означает, что с помощью класса экземпляра Static не имеет никакого значения:

/* 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" 

Если вы чувствуете, как вы потребность указатель на то, что не внутри класса, то вы можете использовать UnsafeMutablePointer или что-то подобное из кода OBJc.

Или вы можете обернуть bool внутри объекта класса (который всегда является ссылкой).

final class RefBool { 
    var val: Bool 
    init(_ value: Bool) { val = value } 
} 

А вот некоторые интересные поведения для ссылочных типов с использованием 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` 
+0

@AlexanderMomchilov спасибо alex Я все еще работал над форматированием, как только понял, что пропустил точку Q и пытался обновить информацию :) – Fluidity

+2

Просто, чтобы уточнить, не существует типа NSUnsafeMutablePointer' Objective-C. 'UnsafeMutablePointer' - это чистый тип Swift, используемый, когда C-указатели соединены с Swift. Но они также могут использоваться и в чистом Swift ('alloc' /' free' и т. Д.), Но вам действительно нужна хорошая причина для получения этого низкого уровня. – JAL

+0

@JAL вы знаете, я думал, что это просто «UnsafeMutablePointer» обычный тип, но затем я просто бросил NS там по прихоти. Сначала я должен был проверить .. Я обновлю. Благодаря!! – Fluidity

Смежные вопросы