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)
每次使用不同的名称和所有者初始化一个新对象都会很有帮助。顺便说一句,如果你的问题能解决你的问题,请将其标记为已回答。