swift - 如何以面向协议(protocol)的方式创建我的游戏架构?

标签 swift struct architecture protocols

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

这是带有 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() {

    }
}

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

这是带有类的第二个版本:

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

    }
}

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

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

最佳答案

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

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

关于swift - 如何以面向协议(protocol)的方式创建我的游戏架构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34808517/

相关文章:

ios - Firebase 云消息传递未收到通知 (iOS)

ios - 如何让 UITextView 检测主题标签?

C++ 在函数参数中正确使用结构

mysql - 通过 char 数组指针存储的结构成员数据返回垃圾值

java - 如何从java源代码中获取类、voids等的依赖关系?

java - 我是否使用 MVC 正确实现了 n 层应用程序?

c++ - 通过 CakePHP 与 C++ 应用程序交互

ios - 检测 UITableView 何时滚动到底部

c++ - 仅在库 cpp 中具有定义的前向声明结构

ios - 使用 swift 显示从 url 下载的图像的加载百分比