generics - Call Class Methods From Protocol As Parameter -


i want able pass class (not initialized object) of protocol type method, call class functions of class in method. code below.

i using swift , have protocol defined this

    //protocol object used fauapiconnection protocol fauapimodel{      //used parse object given dictionary object     class func parsefromjson(json:anyobject) -> self      //required default init     init()  } 

what have method this

    func getsomeparsingdone<t:fauapimodel>(model:t.type? = nil, getpath:path, callingobj:callingclass) -> void     {         //getit inconsequential, logic object path          var returnobj:anyobject = getit.get(path)          if(model != nil){             returnobj = model!.parsefromjson()  <<<<<< type 't' not conform protocol 'anyobject'          }          callingobj.done(returnobj)     } 

object implements protocol

import foundation  class myobj: fauapimodel{       var neededval:string    var nonneededval:string    required convenience init(){     self.init(neededval:"value")   }    init(neededval:string, nonneededval:string = ""){     self.neededval = neededval     self.nonneededval = nonneededval   }    class func parsefromjson(json:anyobject) -> wgmpart   {      return wgmpart() <<<<<<<< method 'parsefromjson' in non-final class 'wgmpart' must return 'self' conform protocol 'fauapimodel'   }  } 

however, keep getting 2 errors. have indicated these above '<<<<<<<<<<<<'

compile error.

lots of little things consider here, let's heart of question. signature want looks this:

func getsomeparsingdone<t:fauapimodel>(model:t.type, path:string) -> t? 

i'm making return optional beause there lot of things fail here, , shouldn't turn of crashes.

i'd recommend protocol this:

protocol fauapimodel {     class func parsefromjson(json:anyobject) -> self } 

that way, you're promising return own class, not parseable. tend mean need make classes final. if don't want them final, you'll need promise init method in order construct it. see protocol func returning self more details on how deal if need it.

so putting together, might in practice:

protocol fauapimodel {   class func parsefromjson(json:anyobject) -> self }  func createobjectofclass<t: fauapimodel>(model: t.type, path: string) -> t? {   if let json: anyobject = getjson(path) {     return model.parsefromjson(json)   }   return nil }  // bogus json reader func getjson(path: string) -> anyobject? {   let json: anyobject? = nsjsonserialization.jsonobjectwithdata(path.datausingencoding(nsutf8stringencoding, allowlossyconversion: true)!, options: nsjsonreadingoptions(0), error: nil)   return json }  // bogus model class returns trivial version of final class something: fauapimodel {   class func parsefromjson(json:anyobject) -> {     return something()   } }  // using let = createobjectofclass(something.self, "/path/to/file") 

Comments

Popular posts from this blog

php - Submit Form Data without Reloading page -

linux - Rails running on virtual machine in Windows -

php - $params->set Array between square bracket -