GarySabo
GarySabo

Reputation: 6680

Immutable value type [string] only has mutating members named append

I'm trying to append a new Store object to my stores array in my User struct...I added a mutating func append to my Struct but I'm still missing something as I'm still getting the

Immutable value type [Store] only has mutating members named 'append'

error

import Foundation

import UIKit

struct User {
    var name: String
    var stores: [Store]



    mutating func append(newStore: Store) {
        stores.append(newStore)
    }
}

extension User: Printable {
    var description: String {
        var printedName = ("\(name as String, stores as [Store])")
        return printedName
    }
}

struct Store {
    var name: String
    var data: [[String: String]]



}

extension Store: Printable {
    var description: String {
        var printedStores = ("\(name as String, data as [[String : String]])")
        return printedStores
}
}

 @IBAction func done(segue: UIStoryboardSegue) {
        let addStoreViewController = segue.sourceViewController as! AddStoreViewController
        let store = addStoreViewController.store
        if let selectedIndex = addStoreViewController.index {
            stores[selectedIndex] = store!
        } else {
            if let selectedUser = user {
                selectedUser.stores.append(store!)
            }
        }
        storeTableView.reloadData()
    }

import UIKit

class AddStoreViewController: UIViewController {


    var store: Store?
    var index: Int?

    @IBOutlet weak var storeTextField: UITextField!

    override func viewDidLoad() {
        super.viewDidLoad()

        if let name = store?.name {
            storeTextField?.text = name
        }

        // Do any additional setup after loading the view.
    }





    // MARK: - Navigation


    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        let name = storeTextField?.text
        if segue.identifier == "addAction" {
            if var store = store {
                self.store?.name = name!
            } else {
                store = Store(name: name!, data: [["": ""]])
                println(store) 
            }
        }
    }



}

Upvotes: 0

Views: 138

Answers (3)

nhgrif
nhgrif

Reputation: 62052

if let selectedIndex = addStoreViewController.index {
    stores[selectedIndex] = store!
} else {
    if let selectedUser = user {
        selectedUser.stores.append(store!)
    }
}

This appears to be the problem section.

We can both simultaneously fix your problem and clean up your else code a bit:

if let store = store, selectedIndex = addStoreViewController.index {
    stores[selectedIndex] = store
} else if let store = store, var selectedUser = user {
    selectedUser.append(store)
}

We're able to append correctly, we don't have an unnecessary level of nesting, and we don't have to force unwrap anything (which leads to crashes).

Upvotes: 1

Leo
Leo

Reputation: 24714

Try this

if var selectedUser = user {
    selectedUser.append(store!)
}

append function belongs to struct user,not user.stores

Upvotes: 2

Kris Gellci
Kris Gellci

Reputation: 9687

I am assuming that selectedUser is a let, yet you are mutating it, make it a var if you plan on mutating it.

let selectedUser = ...
// Should be
var selectedUser = ...

Upvotes: 0

Related Questions