我正在创建字符并希望将它们存储在数组中。当我想存储第二个字符时会出现问题,因为它会覆盖第一个字符的数据 - 似乎存储的是变量而不是内容的镜像:
游乐场代码:
import UIKit
class character {
var name: String
var owner: String
init() {
name = "Frodo"
owner = "Ben"
}
func random() {
name = "Gollum"
owner = "Hans"
}
}
var CharacterArray: [character] = []
let testchar = character.init()
CharacterArray.append(testchar)
testchar.random()
CharacterArray.append(testchar)
当我查看第一个附加数组时,(“Frodo,Ben”)被存储。当我照看第二个附加条目时,两个条目都是(“Gollum”,“Hans”)。
如何确保存储在数组中的数据是单个值?我相信我在这里有一个概念错误。
请告知。
谢谢!
答案 0 :(得分:1)
这不是Swift 4的问题,而是Swift中引用和值类型之间的区别。您可以将character
从类改为struct,您将看到差异。
struct MyCharacter {
var name: String
var owner: String
init() {
name = "Frodo"
owner = "Ben"
}
mutating func random() {
name = "Gollum"
owner = "Hans"
}
}
var myArray: [MyCharacter] = []
var csVal = MyCharacter()
myArray.append(csVal)
csVal.random()
myArray.append(csVal)
for character in myArray {
print(character.name)
}
还有一件事是你应该将类/结构名称的第一个字母大写,并将变量名的第一个字母更改为小写。检查this以获取有关Swift名称约定的更多信息。
如果您仍想保留自己的设计,那么解决方法是从Character
函数返回新的random
。
import UIKit
class Character {
var name: String
var owner: String
init() {
name = "Frodo"
owner = "Ben"
}
init(name: String, owner: String) {
self.name = name
self.owner = owner
}
func random() -> Character {
return Character(name: "Gollum", owner: "Hans")
}
}
var characterArray: [Character] = []
let testchar = Character()
characterArray.append(testchar)
let random = testchar.random()
characterArray.append(random)
for character in characterArray {
print(character.name)
}