2017-01-21 3 views
0

Ich möchte Typhoon (GitHub & WebSite) für Abhängigkeitsinjektion in meiner App verwenden. Ich benutze Swift Version 3 und Typhoon 3.6. Leider stürzt meine App ab, wenn ich versuche, ein Objekt zu initialisieren. Ich habe folgendes Protokoll:Typhoon Parameter Injektion mit Initializer Absturz App

Protokoll

import Foundation 

@objc public protocol Client { 

    func method() 

} 

Protokoll Implementierung

import Foundation 

public class ClientWhateverImpl : NSObject, Client{ 

    let name : String 

    init(name: name) { 
     self.name = name 
    } 

    public func method(){ 
     //make something 
    } 

} 

Assembly

import Foundation 
import Typhoon 

public class MyAssembly: TyphoonAssembly { 

    public dynamic func client() -> AnyObject { 

     return TyphoonDefinition.withClass(ClientWhateverImpl.self) { 
      (definition) in 

      definition!.useInitializer("initWithName:") { 
       (initializer) in 

       initializer!.injectParameter(with: "name") 
      } 

     } as AnyObject 
    } 



} 

Nennen Sie es irgendwo

let myAssembly : MyAssembly = MyAssembly() 
     myAssembly.activate() 

let client = myAssembly.client() 

Leider habe ich die folgende Fehlermeldung:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Method 'initWithName:' not found on 'MyApp.ClientWhateverImpl'. Did you include the required ':' characters to signify arguments?' 

ich einige Beiträge auf Stackoverflow über diesen Fehler lesen, aber auf ihrer Seite sie vergessen, die objectice-c-Methode zu verwenden Syntax. Aber in meinem Fall verwende ich die objc-Methode "initWithName". Gibt es in swift 3 etwas anderes? Hat jemand das gleiche Problem?

+0

hast du das Wiki sehen: https://github.com/appsquickly/Typhoon/wiki/Swift-Quick-Start – muescha

+0

Ich glaube, Sie müssen bei 'ClientWhateverImpl' auch die' TyphoonAssembly' – muescha

+0

Was Sie tun meinst du genau? Ich kann die "Knight" -Klasse in der Kurzanleitung nicht sehen. Ich habe mehr oder weniger den Code der swift-Beispiel-App verwendet, die nur in swift 3 geschrieben wurde. Kannst du vielleicht eine Antwort mit deinem Vorschlag schreiben, um Missverständnisse zu vermeiden. –

Antwort

0

Ok. Ich habe das Problem gefunden. Es hat etwas mit einem Objekt zu tun, das ich spritzen wollte. Es erbt nicht von NSObject und Taifun macht etwas mit ihm und versagt:

definition!.useInitializer("initWithObject:") { 
    (initializer) in 
    initializer!.injectParameter(with: MyObject()) 
} 

Bevor:

public class MyObject{ 

} 

Lösung:

public class MyObject: NSObject{ 

} 

Die Dokumentation selbst sagt, es :

Every class you want to inject has to be a subclass of NSObject in some way (either by subclassing or adding @objc modifier).

Ich dachte nur, die ClientWhateverImpl in meinem Fall muss von NSObject erben. Mein Fehler. Dies ist Frage geschlossen