struct Item {
var name:String?
var type:String?
var value:Int?
var tag:Int?
}
...
...
let petItem = Item(name:petName!.uppercaseString, type:petType, value:0, tag:0)
self.statusLabel.hidden = false
if addItem(petItem) {
self.statusLabel.text = petName! + " successfully added."
self.textField.becomeFirstResponder()
} else {
self.statusLabel.text = "Sorry, Pet couldn't be added."
}
...
...
func addItem(petItem:Item) -> Bool {
if treeIsFull() {
println("Tree is full\n")
} else {
petItem.name = "turkey" <--- *** error ***
...
我无法为结构的任何成员赋值。
我收到以下错误:
错误:无法将'name'分配给'petItem'。
是否有补救措施或者我必须在实例创建期间分配所有值?
答案 0 :(得分:8)
您在petItem
内看到该错误的原因是addItem
是不可变的(您无法更改)。如果要更改传入的实例,则需要以这种方式声明函数:
func addItem(var petItem:Item) -> Bool { ...
不幸的是,现在您还有另一个错误,因为您使用petItem
初始创建的let
变量是不可变的。因此,请将其更改为var
,然后关闭:
var petItem = Item(name:petName!.uppercaseString, type:petType, value:0, tag:0)
现在您可以运行代码,并且您可能会发现name
中设置的addItem()
并未将其发送到petItem
变量。发生了什么?在Swift struct
中,实例按值传递给函数,因此除非参数声明为inout
,否则函数中参数的任何内容都不会影响原始变量。让我们这样做:
func addItem(inout petItem:Item) -> Bool { ...
并且您需要更改通话以表明您知道可以修改此参数:
if addItem(&petItem) { ...