【问题标题】:Immutable value type [string] only has mutating members named append不可变值类型 [string] 只有名为 append 的变异成员
【发布时间】:2015-06-20 00:24:39
【问题描述】:

我正在尝试将一个新的 Store 对象附加到我的 User 结构中的 stores 数组...我在我的 Struct 中添加了一个 mutating func 附加但我仍然缺少一些东西,因为我仍然得到了

不可变值类型 [Store] 只有名为 'append' 的变异成员

错误

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) 
            }
        }
    }



}

【问题讨论】:

  • 对不起:selectedUser.stores.append(store!)

标签: ios swift struct


【解决方案1】:

试试这个

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

append 函数属于 struct user,而不是 user.stores

【讨论】:

    【解决方案2】:
    if let selectedIndex = addStoreViewController.index {
        stores[selectedIndex] = store!
    } else {
        if let selectedUser = user {
            selectedUser.stores.append(store!)
        }
    }
    

    这似乎是问题部分。

    我们可以同时解决您的问题稍微清理一下您的else 代码:

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

    我们能够正确地append,我们没有不必要的嵌套级别,并且我们不必强制解开任何东西(这会导致崩溃)。

    【讨论】:

    • 谢谢!我从未见过这种语法:if let store = store, selectedIndex = addStoreViewController.index 换句话说,逗号可以让您检查多个值?
    【解决方案3】:

    我假设 selectedUser 是一个 let,但您正在对其进行变异,如果您打算对其进行变异,请将其设为 var。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-27
      • 1970-01-01
      • 2016-05-27
      • 1970-01-01
      相关资源
      最近更新 更多