不可变值类型 [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 的变异成员的主要内容,如果未能解决你的问题,请参考以下文章