Inherit the factory parent method

I have a class A and its child class B, which inherits from A.

Now I have a class method in A that takes an instance from somewhere with "inout" and checks if it is nil if it does not fill it with the necessary parameters. For example:

class A
{
    class func fillInstance(inout instance : Self, parameters : [String]) -> Self
    {
          guard let instance = instance else
         {
             return Self(parameters : parameters)
         }

         return instance
    }
}

Now, of course, nothing that has Self is invalid :)

I need a way to make it valid. Is this possible in Swift?

- . , , . , ( , A → B → C → D → E.... ). , :)

+4
3

, , . :

 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).

+1

, , - :

class A {
    var parameters: [String]!

    class func fillInstance(instance: A?, parameters : [String]) -> A? {
        if instance == nil {
            return self.init(parameters: parameters)
        }
        instance!.setParameters(parameters)
        return instance
    }

    func setParameters(parameters: [String]) {
        self.parameters = parameters
    }

    required init(parameters: [String]) {
        self.parameters = parameters
    }
}

A fillInstance:

class B: A {}

let b1 = A.fillInstance(B(), parameters: ["exists"]) as! B

nil A :

let b2 = B.fillInstance(nil, parameters: ["from nil"]) as! B

, , .

0

. , inout . Struct, , , .

:

class A
{
   class func fillInstance(instance : A, parameters : [String]) -> A
   { 
      // do your stuff here
      return instance 
   }

   class func fillInstance(instance : A?, parameters : [String]) -> A?
   {
      if instance != nil 
      { 
        let existing:A = fillInstance(instance!, parameters:parameters)
        return existing
      }
      return nil
   }     
}

Note: this may be even easier if you did not return the instance. you do not need to indicate that the object has been modified. Or is it just for the convenience of imparting a quest chain?

0
source

Source: https://habr.com/ru/post/1624449/


All Articles