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

Posted

技术标签:

【中文标题】不可变值类型 [string] 只有名为 append 的变异成员【英文标题】:Immutable value type [string] only has mutating members named 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!) 【参考方案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 = ...

【讨论】:

以上是关于不可变值类型 [string] 只有名为 append 的变异成员的主要内容,如果未能解决你的问题,请参考以下文章

“结构”的不可变值只有名为“函数”的变异成员

python面试题No5

python可变数据和不可变数据

可变与不可变类型

变量更改值

python中的可变数据类型和不可变数据类型