在swift中,NSObject
的子類可以使用copy
方法來復制實例對象,做法如下:
- 子類必須聲明并實現(xiàn)
NSCopying
協(xié)議倦沧; - 子類實現(xiàn)
copyWithZone:
方法扫尺; - 子類的構(gòu)造方法
init
必須使用requried
關(guān)鍵字修飾
示例代碼:
class ClazzA: NSObject, NSCopying {
var memberA = 0
//必須使用required關(guān)鍵字修飾
required override init() {
}
///實現(xiàn)copyWithZone方法
func copyWithZone(zone: NSZone) -> AnyObject {
let theCopyObj = self.dynamicType.init()
theCopyObj.memberA = self.memberA
return theCopyObj
}
}
ClazzA
類直接繼承NSObject蔗草,并且也實現(xiàn)了NSCopying
的copyWithZone
方法,所以調(diào)用copy
方法來復制ClazzA
對象是沒有問題的叙凡。但是考慮到ClazzA
可以作為其他類的基類劈伴,那么第12行代碼let theCopyObj = self.dynamicType.init()
就不能替換成let theCopyObj = ClazzA()
,否則子類中強制類型轉(zhuǎn)換時將發(fā)生異常握爷。應(yīng)該生成其子類型的對象跛璧,使用dynamicType
來實例化子類型對象,dynamicType
代表動態(tài)類型新啼,即其最頂層的子類類型追城。
假如此時ClazzA
再派生一個子類ClazzB
,使用copy
方法來復制實例對象燥撞∽可以先重載copyWithZone
,然后再調(diào)用父類的copyWithZone
來生成對象物舒,最后對新復制的對象進行賦值色洞,這點很重要,貼上代碼一看就懂:
class ClazzB: ClazzA {
var memberB = 1
///重載copyWithZone
override func copyWithZone(zone: NSZone) -> AnyObject {
let theCopyObj = super.copyWithZone(zone) as! ClazzB
theCopyObj.memberB = self.memberB
return theCopyObj
}
}