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

标签 arrays swift class

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

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/

相关文章:

c# - 在具有泛型类型的类上实现 IDisposable,其中泛型类型是一次性的

c++ - 将内存分配给派生类的指针

swift - var set to struct 修改时真的被替换了吗?

Swift查询解析类中的所有对象

java - 如何添加整数构造函数和公共(public)签名java

c++ - 堆或栈数组。用户定义的类型难题

.net - 带双括号 ()() 的 VB.NET 数组

arrays - 寻找具有最小乘积的三个项目的 K 个组合

javascript - 根据数组中其中一个属性的值对对象数组进行排序

ios - 有没有办法滚动到集合中选定的 UICollectionViewCell?