1

When I searched on here I now know that almost everything in Swift is value based, not referenced base. I also have read that a class holds references. I tried my best, but below code will not print anything. If anyone could help me out printing out that line with the help of an array, that would be great :) (if it is possible ofcourse...).

Edit: I want 5 booleans in the array, in which they all have a didSet method. When I access them, that specific didSet will trigger. Is that possible?

class PowerUpBooleans{
    var boolean: Bool
    init(boolean: Bool){
        self.boolean = boolean
    }
}
var iWantToChangeThis = false{
        didSet{
            print("it worked")
        }
    }
    var powerUpBooleans = [PowerUpBooleans]()
override func viewDidLoad() {
        super.viewDidLoad()
        powerUpBooleans.append(PowerUpBooleans(boolean: iWantToChangeThis))
        powerUpBooleans[0].boolean = true
     }
NoKey
  • 129
  • 11
  • 32
  • 1
    Bool is pass by value, not by reference – koropok Aug 11 '17 at 01:20
  • @koropok yes but is there any to keep a reference to that boolean in an array? Or is this not possible at all? Thank you. – NoKey Aug 11 '17 at 01:23
  • you can try the answer below, or use inout. – koropok Aug 11 '17 at 01:27
  • @koropok I will search for inout methods. I editted my question to make it more clear what I want. I want to have a didSet method on all the variables. – NoKey Aug 11 '17 at 01:35
  • you can check this out. https://stackoverflow.com/questions/40745099/how-to-pass-a-reference-to-a-boolean-rather-than-its-value – koropok Aug 11 '17 at 01:36

1 Answers1

3

I guess you want set some booleans that have their own trigger.

As I known, making value type wrapped by class can only make it be reference type.

So try this.

class PowerUpBooleans{
  var boolean: Bool {
    didSet {
      trigger()
    }
  }
  var trigger: () -> ()

  init(boolean: Bool, trigger: @escaping () -> ()){
    self.boolean = boolean
    self.trigger = trigger
  }
}

let trigger1 = {
  print("one worked.")
}
let trigger2 = {
  print("two worked.")
}

var powerUpBooleans = [PowerUpBooleans]()
powerUpBooleans.append(PowerUpBooleans(boolean: false, trigger: trigger1))
powerUpBooleans.append(PowerUpBooleans(boolean: false, trigger: trigger2))
powerUpBooleans[0].boolean = true   // print one worked
powerUpBooleans[1].boolean = false  // print two worked
ribilynn
  • 460
  • 5
  • 21