Using 'self' in class extension functions in Swift -


i'm looking able pull out instance of uiview subclass nib.

i'd able call mycustomview.instantiatefromnib() , have instance of mycustomview. i'm ready port working objective-c code have via bridging header, figured i'd try idiomatic approach first. 2 hours ago.

extension uiview {     class func instantiatefromnib() -> self? {          let toplevelobjects = nsbundle.mainbundle().loadnibnamed("customviews", owner: nil, options: nil)          toplevelobject in toplevelobjects {             if (toplevelobject self) {                 return toplevelobject             }         }          return nil     } } 

now if (toplevelobject self) { wrong because "expected type after 'is'". i've tried after shows lot don't understand swift type system.

  • if (toplevelobject self) {
  • if (toplevelobject self.dynamictype) {
  • if (toplevelobject self.self) {
  • a million other variations not wrong.

any insight appreciated.

using approach how can create instances of managed object subclasses in nsmanagedobject swift extension? can define generic helper method infers type of self calling context:

extension uiview {      class func instantiatefromnib() -> self? {         return instantiatefromnibhelper()     }      private class func instantiatefromnibhelper<t>() -> t? {         let toplevelobjects = nsbundle.mainbundle().loadnibnamed("customviews", owner: nil, options: nil)          toplevelobject in toplevelobjects {             if let object = toplevelobject as? t {                 return object             }         }         return nil     } } 

this compiles , works expected in quick test. if mycustomview uiview subclass then

if let customview = mycustomview.instantiatefromnib() {     // `customview` `mycustomview`     // ... } else {     // not found in nib file } 

gives instance of mycustomview, , type inferred automatically.


update swift 3:

extension uiview {      class func instantiatefromnib() -> self? {         return instantiatefromnibhelper()     }      private class func instantiatefromnibhelper<t>() -> t? {         if let toplevelobjects = bundle.main.loadnibnamed("customviews", owner: nil, options: nil) {             toplevelobject in toplevelobjects {                 if let object = toplevelobject as? t {                     return object                 }             }         }         return nil     } } 

Comments

Popular posts from this blog

mysql - Dreamhost PyCharm Django Python 3 Launching a Site -

java - Sending SMS with SMSLib and Web Services -

java - How to resolve The method toString() in the type Object is not applicable for the arguments (InputStream) -