有人能帮我理解这个Swift代码吗?根据我目前正在阅读的书,这段代码是原型设计模式的实现:
class AbstractCard {
var name: String?
var mana: Int?
var attack: Int?
var defense: Int?
init(name:String?, mana:Int?, attack:Int?, defense:Int?) {
self.name = name
self.attack = attack
self.defense = defense
self.mana = mana
}
func clone() -> AbstractCard {
return AbstractCard(name: self.name, mana: self.mana, attack:
self.attack, defense: self.defense)
}
}
class Card: AbstractCard {
var someNumber: Int
override init(name:String?, mana:Int?, attack:Int?, defense:Int? ){
someNumber = 2
super.init(name: name,mana: mana,attack: attack,defense:
defense)
}
}
// Simulate our client
// This is the card that we will copy
let raidLeader = Card(name: "Raid Leader", mana: 3, attack: 2, defense: 2)
// Now we use our faceless Manipulator card to clone the
let facelessManipulator = raidLeader.clone()
print("\(facelessManipulator.name, facelessManipulator.mana, facelessManipulator.attack, facelessManipulator.defense)")
print(facelessManipulator.dynamicType) // prints "AbstractCard"如果克隆对象的dynamicType仍然是AbstractCard而不是卡片,那么这种模式有什么意义。您甚至不能访问特定于Card的vars。我试图将这个对象转换为Card,但是我得到了一个错误"Execution was interrupted reason: signal SIGABRT"
发布于 2016-08-04 16:27:09
让我们首先了解一下原型模式:
原型模式通过复制一个现有对象(称为原型)来创建新的对象。
首先,有很多实现原型模式的方法,我认为本书的作者在这个案例中试图用最合适的方式来解释模式的用户案例。
因此,当有人输入注释时,应该在子类中重写clone方法,以正确地允许对象的克隆,如下所示:
class Card: AbstractCard {
var someNumber: Int
override init(name:String?, mana:Int?, attack:Int?, defense:Int? ){
someNumber = 2
super.init(name: name,mana: mana,attack: attack,defense:
defense)
}
override func clone() -> AbstractCard {
return Card(name: self.name, mana: self.mana, attack:
self.attack, defense: self.defense)
}
}我不得不说,我作为一名技术评论家为这本书工作,我认为作者表达了更好的方式,他可以使用这种模式。
如果仔细考虑,每次在Swift (数组、Int、Bool等)中使用值类型时,都会应用此模式,因为每次将实例的值分配给另一个实例时,都会使用相同的值创建新副本。问题在于,每当将实例分配给新实例时,引用值(类)都会共享其值并对其进行修改。
实现该模式的另一种方法是使用NSCopying协议,该协议声明提供对象功能副本的方法,在我看来,这是使用最多的方法。
例如:
class Card: NSObject, NSCopying {
var name: String?
var mana: Int?
var attack: Int?
var defense: Int?
init(name:String?, mana:Int?, attack:Int?, defense:Int?) {
self.name = name
self.attack = attack
self.defense = defense
self.mana = mana
}
func copyWithZone(zone: NSZone) -> AnyObject {
return Card(name: self.name, mana: self.mana, attack: self.attack, defense: self.defense)
}
}
// Simulate our client
// This is the card that we will copy
let raidLeader = Card(name: "Raid Leader", mana: 3, attack: 2, defense: 2)
// Now we use our faceless Manipulator card to clone the
let facelessManipulator = raidLeader.copy() as Card
raidLeader.attack = 5
print("\(facelessManipulator.name, facelessManipulator.mana, facelessManipulator.attack, facelessManipulator.defense)")
print("\(raidLeader.name, raidLeader.mana, raidLeader.attack, raidLeader.defense)")您可以通过以下问题了解更多有关此问题的信息:
希望这能帮到你。
https://stackoverflow.com/questions/38771078
复制相似问题