Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to Properly Declare Array of Custom Objects in Swift?

Here is my custom class...not sure if I'm missing anything in it...

import UIKit  class baseMakeUp {     var Image = UIImage()     var Brand: String     var Color: String     var Rating: Int = 0      init (Brand: String, Color: String) {         self.Brand = Brand         self.Color = Color     } } 

I'm trying to instantiate here...

import UIKit  class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {      required init(coder aDecoder: NSCoder) {         fatalError("init(coder:) has not been implemented")     }      let cellIdentifier = "cellIdentifier"      var foundation: [[baseMakeUp]]     var blush: [[baseMakeUp]]     var eyes: [[baseMakeUp]]     var lips: [[baseMakeUp]]     var nails: [[baseMakeUp]]      // put some test data in makeup arrays here...     foundation[0].Brand = "Revlon"     -------------> "Expected declaration" error.     foundation[0].Color = "Red"     foundation[0].Rating = 3     foundation[1].Brand = "MAC"     foundation[1].Color = "Blue"     foundation[1].Rating = 4 

I didn't include the rest of the ViewController class, because I didn't think it was necessary.

The error occurs when I attempt to assign a value to foundation[0].Brand

Appreciate your help in advance!

like image 339
jbd36 Avatar asked Jan 27 '15 04:01

jbd36


People also ask

How do you declare an array variable in Swift?

Array in swift is written as **Array < Element > **, where Element is the type of values the array is allowed to store. The type of the emptyArray variable is inferred to be [String] from the type of the initializer. The groceryList variable is declared as “an array of string values”, written as [String].

How do I initialize an array in Swift?

To initialize a set with predefined list of unique elements, Swift allows to use the array literal for sets. The initial elements are comma separated and enclosed in square brackets: [element1, element2, ..., elementN] .

How do you create an array of arrays in Swift?

In Swift, creating a multi-dimensional array is just a matter of adding another set of brackets. For example, to turn our [String] array into an array of arrays, you would just write [[String]] .


1 Answers

First, I'm going to assume you didn't want 2d arrays. If you did, I'll answer your question from that perspective below.

    var foundation = [baseMakeUp]() 

Creates an empty array of baseMakeUp called foundation. You can't use subscripting to add elements to an array, you can only use it to change existing elements. Since your array is empty you add elements with append.

   foundation.append(baseMakeUp(Brand: "Brand", Color: "Color")) 

Since you don't have a baseMakeUp initializer that allows you to pass a rating that element's rating is 0. However since you appended it to your array you can now use subscripting to change it's Rating variable like this:

foundation[0].Rating = 3 

If you did intend for 2d arrays.

    var foundation = [[baseMakeUp]]() 

To create the array

    foundation.append([])     foundation[0].append(baseMakeUp(Brand: "Brand", Color: "Color"))     foundation[0][0].Rating = 3 

The first line appends an empty array to your top level array. The second line appends a baseMakeUp to the array added in the first line. The third line uses subscripting to change the Rating of the first element in the first array of your 2d array.

Hopefully that helps with your problem.

Additionally

I was going to add points 1 and 2 from jday001s answer here, but you should check out their answer as well.

Edit

I just realized that you're trying to add elements to your arrays in the wrong scope.

You'll have to move your

foundation.append(baseMakeUp(Brand: "Brand", Color: "Color") 

inside a function and call it yourself or place them inside something like viewDidLoad

eg:

class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {      var foundation = [baseMakeUp]()      override func viewDidLoad() {         super.viewDidLoad()          foundation.append(baseMakeUp(Brand: "Brand", Color: "Color")         foundation[0].Rating = 3     } } 

Hopefully that's helpful.

like image 104
Nightly Avatar answered Sep 17 '22 12:09

Nightly