首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Swift原型设计模式

Swift原型设计模式
EN

Stack Overflow用户
提问于 2016-08-04 15:06:58
回答 1查看 1.3K关注 0票数 1

有人能帮我理解这个Swift代码吗?根据我目前正在阅读的书,这段代码是原型设计模式的实现:

代码语言:javascript
复制
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"

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-04 16:27:09

让我们首先了解一下原型模式:

原型模式通过复制一个现有对象(称为原型)来创建新的对象。

首先,有很多实现原型模式的方法,我认为本书的作者在这个案例中试图用最合适的方式来解释模式的用户案例。

因此,当有人输入注释时,应该在子类中重写clone方法,以正确地允许对象的克隆,如下所示:

代码语言:javascript
复制
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协议,该协议声明提供对象功能副本的方法,在我看来,这是使用最多的方法。

例如:

代码语言:javascript
复制
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)")

您可以通过以下问题了解更多有关此问题的信息:

希望这能帮到你。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38771078

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档