我还没有找到任何好方法来为游戏设计面向协议的项目架构。
继承人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() {
}
}
这看起来很不错,但问题是这些是引用类型,我希望它们是值类型。
解决这个问题的正确方法是什么?
答案 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")
}