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

时间:2017-07-20 01:11:55

标签: arrays swift class

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

游乐场代码:

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”)。

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

请告知。

谢谢!

1 个答案:

答案 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)
}