, , . :
class A
{
class func fillInstance<T:A>(instance : T, parameters : [String]) -> T
{
// do your stuff here
instance.filledContent["A.fillInstance"] = "\(parameters)"
return instance
}
class func fillInstance<T:A>(instance : T?, parameters : [String]) -> T?
{
if instance != nil
{
let existing:T = T.fillInstance(instance!, parameters:parameters)
return existing
}
return nil
}
var filledContent:[String:String] = [:]
}
class B:A
{
func showContent() -> String { return "Showing: \(filledContent)" }
override class func fillInstance<T:A>(instance : T, parameters : [String]) -> T
{
instance.filledContent["B.fillInstance"] = "B Specific Filling"
return A.fillInstance(instance, parameters:parameters)
}
}
let anInstanceOfA = A()
A.fillInstance(anInstanceOfA, parameters: ["A->Param","To A"]).filledContent
// ["A.fillInstance": "["A->Param", "To A"]"]
let anInstanceOfB = B()
A.fillInstance(anInstanceOfB, parameters: ["A->Param","To B"]).showContent()
// "Showing: ["A.fillInstance": "["A->Param", "To B"]"]"
var optionalA:A? = A()
A.fillInstance(optionalA, parameters: ["A->Param","To A?"])?.filledContent
// ["A.fillInstance": "["A->Param", "To A?"]"]
B.fillInstance(optionalA, parameters: ["B->Param","To A?"])?.filledContent
// ["A.fillInstance": "["B->Param", "To A?"]"]
optionalA = nil
A.fillInstance(optionalA, parameters: ["A->Param","To A?(nil)"])?.filledContent
// nil
var optionalB:B? = B()
A.fillInstance(optionalB, parameters: ["A->Param","To B?"])?.showContent()
// "Showing: ["B.fillInstance": "B Specific Filling", "A.fillInstance": "["A->Param", "To B?"]"]"
B.fillInstance(optionalB, parameters: ["B->Param","To B?"])?.showContent()
// "Showing: ["B.fillInstance": "B Specific Filling", "A.fillInstance": "["B->Param", "To B?"]"]"
optionalB = nil
A.fillInstance(optionalB, parameters: ["A->Param","To B?(nil)"])?.showContent()
// nil
B.fillInstance(optionalB, parameters: ["B->Param","To B?(nil)"])?.showContent()
// nil
, , , , , .
, , , , , B , A ( B).