我正在创建角色并想将它们存储在一个数组中。当我想存储第二个字符时会出现问题,因为它会覆盖第一个字符的数据 - 似乎存储的是变量而不是内容的镜像:
Playground 中的代码:
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”)。
如何确保数组中存储的数据是一个单独的值?我相信我在这里有一个概念错误。
请指教。
谢谢!
最佳答案
那不是Swift 4的问题,而是Swift中引用类型和值类型的区别。您可以将您的 character
从类更改为结构,您将看到不同之处。
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 名称约定的更多信息。
如果您仍想保留您的设计,解决方法是从您的 random
函数返回一个新的 Character
。
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)
}
关于arrays - 将类数据存储在不可修改的 swift 4 数组中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45203518/