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

时间:2016-01-15 10:00:02

标签: swift struct architecture protocols

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

继承人Structs的第一个版本:

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() {

    }
}

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

继承了Classes的第二个版本:

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

    }
}

这看起来很不错,但问题是这些是引用类型,我希望它们是值类型。

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

1 个答案:

答案 0 :(得分:1)

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

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")
}