Swift 如何以面向协议的方式创建我的游戏架构?

Swift 如何以面向协议的方式创建我的游戏架构?,swift,struct,architecture,protocols,Swift,Struct,Architecture,Protocols,我还没有找到为游戏设计面向协议的项目架构的好方法 以下是第一个带有结构的版本: protocol Usable { func useItem() } protocol Item { var name: String { get } var amount: Int { get } var image: String { get } } struct Sword: Item, Usable { var name = "" var amount = 0

我还没有找到为游戏设计面向协议的项目架构的好方法

以下是第一个带有结构的版本:

protocol Usable {
    func useItem()
}
protocol Item {
    var name: String { get }
    var amount: Int { get }
    var image: String { get }
}
struct Sword: Item, Usable {
    var name = ""
    var amount = 0
    var image = ""
    func useItem() {

    }
}
struct Shield: Item, Usable {
    var name = ""
    var amount = 0
    var image = ""
    func useItem() {

    }
}
问题是我必须复制粘贴变量,这些变量是跨项目的大量代码

下面是第二个版本,包含类:

protocol Usable {
    func useItem()
}
class BaseItem {
    var name = ""
    var amount = 0
    var image = ""
}
class SwordClass: BaseItem, Usable {
    func useItem() {

    }
}
这看起来不错,但问题是这些是引用类型,我更喜欢它们是值类型


解决此问题的正确方法是什么?

您应该创建一个符合协议的通用结构,它需要使用默认值初始化和“使用”闭包:

protocol Usable {
    func useItem()
}
protocol Item {
    var name: String { get }
    var amount: Int { get }
    var image: String { get }
}
struct UsableItem: Item, Usable {
    var name = ""
    var amount = 0
    var image = ""
    let use: (Void -> Void)

    init(name: String, image: String, use: (Void -> Void)) {
        self.name = name
        self.image = image
        self.use = use
    }

    func useItem() {
        self.use()
    }
}
然后,JSON处理将创建具有适当逻辑的实例:

var sword = UsableItem(name: "sword", image: "sword") {
     print("cut")
}

想必事物确实有不同的名称、数量和图像,需要设置在某个地方?您考虑过使用扩展吗?我正在考虑解析一些JSON并动态设置名称和图像文件。在任何情况下,首次初始化时,金额始终为0。不幸的是,协议扩展不存储值属性。我只有一个问题,如果是某种类型的项目,比如说圣光之盾。当它被损坏时,它会治愈用户或其他随机的东西。这个系统是一个很好的方法,但是如果我想在将来自定义项目,它就不起作用了。你有其他的选择吗?应该使用其他的结构/类来处理这个问题,这些结构/类将相关的对象作为参数并对它们进行操作。它也有自己的逻辑和数据,比如时间方面,它不能直接作为数据的一部分。