Arrays 将类数据存储在swift 4中不可修改的数组中

Arrays 将类数据存储在swift 4中不可修改的数组中,arrays,swift,class,Arrays,Swift,Class,我正在创建字符并希望将它们存储在数组中。当我想存储第二个字符时会出现问题,因为它会覆盖第一个字符的数据-似乎存储的是变量而不是内容的镜像: 操场守则: import UIKit class character { var name: String var owner: String init() { name = "Frodo" owner = "Ben" } func random() { name

我正在创建字符并希望将它们存储在数组中。当我想存储第二个字符时会出现问题,因为它会覆盖第一个字符的数据-似乎存储的是变量而不是内容的镜像:

操场守则:

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”)。当我查看第二个append时,两个条目都是(“Gollum”、“Hans”)

如何确保存储在数组中的数据是单个值?我相信我在这方面有一个概念上的错误

请告知


谢谢

这不是Swift 4的问题,而是Swift中引用类型和值类型之间的区别。您可以将
字符
从类更改为结构,您将看到不同之处

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)
}
还有一件事,您应该大写类/结构名称的第一个字母,并将变量名称的第一个字母改为小写。有关Swift名称约定的更多信息,请查看


如果您仍然希望保留您的设计,一个解决方法是从
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)
}

哇!谢谢你的快速帮助!使用“struct”而不是类解决了这个问题!我的参考代码是在swift 2中编程的,虽然字符被定义为“类”(但我不能再执行代码了,因为更改太多!)。我更新了我的答案,以防您想要保留您的设计,但是,根据您的目标,它应该得到改进。另一件事是,您还应该查看一下Swift中的命名约定,以确保其清晰性。谢谢。真正的代码不需要一个随机函数,它在一个循环中捕获来自数据库的条目,因此它总是使用一个同名常量。我还根据命名约定调整了代码。非常感谢您的帮助。在这种情况下,在循环中使用
init(name:String,owner:String)
每次使用不同的名称和所有者初始化一个新对象都会很有帮助。顺便说一句,如果你的问题能解决你的问题,请将其标记为已回答。