load array members automatically

I am new to Xcode and am seeking a better method to automatically load members to an array. The solution I was using worked fine in a Playground, but not in Xcode App construction.

  • In lines 12-20 below you can see that I have removed the method that worked in Playgrounds and caused crashes in Xcode
  • Lines 36-47 show my current solution, and it works fine with no crashes.


However, I can't help but feel there is a better solution. I thought a for loop could add them, but have been unable to find documentation on that.


Is there a better method?


Thanks,

Mike


import Foundation

struct animal {
    let animalNumber: Int
    let animalName: String
    let norwegianName: String
    
    var fileName: String {
        return "animal\(animalNumber)"
    }
    
    //init() below worked fine in Playground and added to array, but cause fatal error in Xcode
    /*
    init(animalNumber: Int, animalName: String, norwegianName: String) {
        self.animalNumber = animalNumber
        self.animalName = animalName
        self.norwegianName = norwegianName
        animals.append(self)
    }
 */
}
let animal0 = animal(animalNumber: 0, animalName: "chicken", norwegianName: "Høne")
let animal1 = animal(animalNumber: 1, animalName: "rooster", norwegianName: "Hane")
let animal2 = animal(animalNumber: 2, animalName: "Deer", norwegianName: "Hjort")
let animal3 = animal(animalNumber: 3, animalName: "Llama", norwegianName: "llama")
let animal4 = animal(animalNumber: 4, animalName: "Cow", norwegianName: "Ku")
let animal5 = animal(animalNumber: 5, animalName: "Donkey", norwegianName: "Esel")
let animal6 = animal(animalNumber: 6, animalName: "Sheep", norwegianName: "Sau")
let animal7 = animal(animalNumber: 7, animalName: "Goat", norwegianName: "Geit")
let animal8 = animal(animalNumber: 8, animalName: "Cat", norwegianName: "Katt")
let animal9 = animal(animalNumber: 9, animalName: "Dog", norwegianName: "Hund")

var animals = [animal]()

//manually add members to the array
func addToArray() {
animals.append(animal0)
animals.append(animal1)
animals.append(animal2)
animals.append(animal3)
animals.append(animal4)
animals.append(animal5)
animals.append(animal6)
animals.append(animal7)
animals.append(animal8)
animals.append(animal9)
}

Accepted Reply

Isn't it a duplicate post ?

Fatal error here ? : animals.append(self) Because animals is not yet defined


Anyway, you can do this:


import Foundation

struct Animal {          // Name of struct should start with uppercase
    let animalNumber: Int
    let animalName: String
    let norwegianName: String

    var fileName: String {          // Do you really use it somewhere ?
        return "animal\(animalNumber)"
    }

    //init() below worked fine in Playground and added to array, but cause fatal error in Xcode
    /*
    init(animalNumber: Int, animalName: String, norwegianName: String) {
        self.animalNumber = animalNumber
        self.animalName = animalName
        self.norwegianName = norwegianName
        animals.append(self)
    }
*/
}

let animalNames : [(name: String, norwegianName: String) = [("chicken", "Høne"), ("rooster", "Hane"), ("Deer", "Hjort"), ("Llama", "llama"), ("Cow", "Ku"), ("Donkey", "Esel"), ("Sheep", "Sau"), ("Goat", "Geit"), ("Cat", "Katt"), ("Dog", "Hund")]
/*
     let animal0 = animal(animalNumber: 0, animalName: "chicken", norwegianName: "Høne")
     let animal1 = animal(animalNumber: 1, animalName: "rooster", norwegianName: "Hane")
     let animal2 = animal(animalNumber: 2, animalName: "Deer", norwegianName: "Hjort")
     let animal3 = animal(animalNumber: 3, animalName: "Llama", norwegianName: "llama")
     let animal4 = animal(animalNumber: 4, animalName: "Cow", norwegianName: "Ku")
     let animal5 = animal(animalNumber: 5, animalName: "Donkey", norwegianName: "Esel")
     let animal6 = animal(animalNumber: 6, animalName: "Sheep", norwegianName: "Sau")
     let animal7 = animal(animalNumber: 7, animalName: "Goat", norwegianName: "Geit")
     let animal8 = animal(animalNumber: 8, animalName: "Cat", norwegianName: "Katt")
     let animal9 = animal(animalNumber: 9, animalName: "Dog", norwegianName: "Hund")
*/
var animals = [Animal]()

// Loop to add members to the array
func addToArray() {
     for i in 0..<10 {
          let animal = Animal(animalNumber: i, animalName: animalNames[i].name, norwegianName: animalNames[i].norwegianName)
          animals.append(animal)
     }
/*
     animals.append(animal0)
     animals.append(animal1)
     animals.append(animal2)
     animals.append(animal3)
     animals.append(animal4)
     animals.append(animal5)
     animals.append(animal6)
     animals.append(animal7)
     animals.append(animal8)
     animals.append(animal9)
*/
}

So, at the end, that's pretty compact code:


import Foundation

struct Animal {          // Name of struct should start with uppercase
    let animalNumber: Int
    let animalName: String
    let norwegianName: String

    var fileName: String {          // Do you really use it somewhere ?
        return "animal\(animalNumber)"
    }
}

let animalNames : [(name: String, norwegianName: String) = [("chicken", "Høne"), ("rooster", "Hane"), ("Deer", "Hjort"), ("Llama", "llama"), ("Cow", "Ku"), ("Donkey", "Esel"), ("Sheep", "Sau"), ("Goat", "Geit"), ("Cat", "Katt"), ("Dog", "Hund")]

var animals = [Animal]()

// Loop to add members to the array
func addToArray() {
     for i in 0..<10 {
          let animal = Animal(animalNumber: i, animalName: animalNames[i].name, norwegianName: animalNames[i].norwegianName)
          animals.append(animal)
     }
}

You call addToArray in viewDidLoad for instance

Replies

Isn't it a duplicate post ?

Fatal error here ? : animals.append(self) Because animals is not yet defined


Anyway, you can do this:


import Foundation

struct Animal {          // Name of struct should start with uppercase
    let animalNumber: Int
    let animalName: String
    let norwegianName: String

    var fileName: String {          // Do you really use it somewhere ?
        return "animal\(animalNumber)"
    }

    //init() below worked fine in Playground and added to array, but cause fatal error in Xcode
    /*
    init(animalNumber: Int, animalName: String, norwegianName: String) {
        self.animalNumber = animalNumber
        self.animalName = animalName
        self.norwegianName = norwegianName
        animals.append(self)
    }
*/
}

let animalNames : [(name: String, norwegianName: String) = [("chicken", "Høne"), ("rooster", "Hane"), ("Deer", "Hjort"), ("Llama", "llama"), ("Cow", "Ku"), ("Donkey", "Esel"), ("Sheep", "Sau"), ("Goat", "Geit"), ("Cat", "Katt"), ("Dog", "Hund")]
/*
     let animal0 = animal(animalNumber: 0, animalName: "chicken", norwegianName: "Høne")
     let animal1 = animal(animalNumber: 1, animalName: "rooster", norwegianName: "Hane")
     let animal2 = animal(animalNumber: 2, animalName: "Deer", norwegianName: "Hjort")
     let animal3 = animal(animalNumber: 3, animalName: "Llama", norwegianName: "llama")
     let animal4 = animal(animalNumber: 4, animalName: "Cow", norwegianName: "Ku")
     let animal5 = animal(animalNumber: 5, animalName: "Donkey", norwegianName: "Esel")
     let animal6 = animal(animalNumber: 6, animalName: "Sheep", norwegianName: "Sau")
     let animal7 = animal(animalNumber: 7, animalName: "Goat", norwegianName: "Geit")
     let animal8 = animal(animalNumber: 8, animalName: "Cat", norwegianName: "Katt")
     let animal9 = animal(animalNumber: 9, animalName: "Dog", norwegianName: "Hund")
*/
var animals = [Animal]()

// Loop to add members to the array
func addToArray() {
     for i in 0..<10 {
          let animal = Animal(animalNumber: i, animalName: animalNames[i].name, norwegianName: animalNames[i].norwegianName)
          animals.append(animal)
     }
/*
     animals.append(animal0)
     animals.append(animal1)
     animals.append(animal2)
     animals.append(animal3)
     animals.append(animal4)
     animals.append(animal5)
     animals.append(animal6)
     animals.append(animal7)
     animals.append(animal8)
     animals.append(animal9)
*/
}

So, at the end, that's pretty compact code:


import Foundation

struct Animal {          // Name of struct should start with uppercase
    let animalNumber: Int
    let animalName: String
    let norwegianName: String

    var fileName: String {          // Do you really use it somewhere ?
        return "animal\(animalNumber)"
    }
}

let animalNames : [(name: String, norwegianName: String) = [("chicken", "Høne"), ("rooster", "Hane"), ("Deer", "Hjort"), ("Llama", "llama"), ("Cow", "Ku"), ("Donkey", "Esel"), ("Sheep", "Sau"), ("Goat", "Geit"), ("Cat", "Katt"), ("Dog", "Hund")]

var animals = [Animal]()

// Loop to add members to the array
func addToArray() {
     for i in 0..<10 {
          let animal = Animal(animalNumber: i, animalName: animalNames[i].name, norwegianName: animalNames[i].norwegianName)
          animals.append(animal)
     }
}

You call addToArray in viewDidLoad for instance

Thanks so much Claude31, yes indeed that's pretty compact code and a pleasure to read.


FYI, it wasn't so much a "duplicate" post as a "next step" post. My earlier post was to simply add to the array, whereas this was about building efficiency with a loop. The file name is used for the graphic.


I truly appreciate all your help, and have learned some important skills with your solution.

Thanks for taking time to give a hand to a beginner,

Mike

You're welcome.


We all were beginner some time !


Good continuation.